Многопоточность независимых задач - PullRequest
2 голосов
/ 14 марта 2012

У меня есть N задач, которые независимы (например, пишут по разным адресам памяти), но не занимают ровно одно и то же время (скажем, от 2 до 10 секунд).У меня есть P потоков.

Я могу разделить свои N задач на P потоков и запускать свои.В конце концов, в конце остается один поток для выполнения нескольких последних задач, что не является оптимальным.

Я также могу запускать P потоков с 1 задачей каждый, WaitForMultipleObjects, а также повторно запускать P потоков и т. Д.(это то, что я сейчас делаю, поскольку накладные расходы на создание потоков невелики по сравнению с задачей).Однако это также не решает проблему, в какой-то момент потоки P-1 все еще будут ожидать последнего.

Есть ли способ запустить потоки, и как только поток завершит свою работу?задача, перейти к следующей доступной задаче, пока все задачи не будут выполнены?

Спасибо!

1 Ответ

2 голосов
/ 14 марта 2012

да, это называется пул потоков.Это очень распространенная практика.

http://en.wikipedia.org/wiki/Thread_pool_pattern

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

while (bRunning) {
   task = m_pQueue.pop();
   if (task) {
      executeTask(task);
   }
   else {
    //you can sleep a bit here if you want
   } 
}

Существуют более элегантные способы его реализации (избегание снов и т. Д.), Но это суть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...