2009-04-26 5 views
1

У меня есть функция, которую нужно вызывать с различным количеством потоков каждый раз (я делаю некоторые вычисления производительности, поэтому вам нужно знать, когда производительность начинает ухудшаться). Пример приведен ниже:Вызов функции с различным количеством потоков, переданных приложению

getTime() { 
    return 0; 
} 

int main() { 
    boost::threadpool::thread_pool<> threads(nThreads); 

    for(int j = 0; j <= nLines; j++){ 
     threads.schedule(boost::bind(&getTime, nThreads, 1)); 
    } 

    threads.wait(); 
} 

Где, nThreads: Значение дано в командной строке

Мой вопрос, будет это даст мне желаемого результата, чтобы бы этот вызов функции «GetTime» с 'nThreads' каждый раз, когда цикл for получает доступ к программе? Или мне нужен другой метод, чтобы узнать то же самое?

то, что я действительно хочу сделать это:

boost::threadpool::thread_pool<> threads(nThreads); 
// start a new thread that calls the "getTime" function 
for(int j = 0; j <= nLines; j++){ 
    //threads.schedule(boost::bind(&getTime, nThreads, 1)); 
    threads.schedule(boost::bind(&getTime, 0, nLines, pc)); 
} 

(не уверен, что из выше является правильным.)

GetTime() функция должна работать с указанным количеством строк который я получаю из текстового файла и даю каждой строке api, чья производительность я хочу рассчитать. но это не связано с вопросом, который у меня есть.

Я хочу каждый раз вызывать функцию с различным количеством потоков и рассчитать, сколько времени потребовалось каждому потоку. что было общее время с 1 нить, что было общее время, затраченное на 2 нитями, чтобы закончить и т.д.

ответ

1

Если я правильно понимаю, что вы действительно хотите сделать что-то вроде этого:

int main() 
{ 
    int nbThreads = 20; 
    boost::threadpool::thread_pool<> threads(nbThreads); 

    for(int threadId = 0; threadId <= nbThreads ; ++threadId) 
    { 
     threads.schedule(getTime); 
    } 
    threads.wait(); 
} 

Если я прав, вам не нужно использовать boost :: bind здесь.

Обратите внимание, что Boost.ThreadPool не является частью Boost (еще?). Это будет reviewed, но дата пересмотра еще не запланирована.

+0

извините, мой плохой. не утверждал, что я хочу, чтобы процесс выполнялся для нескольких разных значений, которые хранятся в этой переменной строки и инициализируются в getTime(). Следовательно, требование для цикла FOR. то, что вы дали, будет означать другую петлю FOR внутри той, которую я дал. исправить меня, если не так? – gagneet

+0

Прошу прощения, я все еще не понимаю, думаю. Я понимаю, что вы хотите сделать ** какую-то работу ** (я точно не знаю) и распределить ее по предоставленному числу потоков. Эта работа, похоже, вызывает nbLines для функции getTime, но я не уверен. И я не знаю, как вы хотите использовать nbLines во всем этом. Пожалуйста, постарайтесь уточнить! –

+0

Я отредактировал главный вопрос. сообщите, если требование все еще неясно. – gagneet

1

Как насчет использования чего-то вроде OpenMP? Если масштабируемость является вашей целью, это, вероятно, лучший выбор.