boost :: thread: Как запустить все потоки, но одновременно может работать только до n? - PullRequest
3 голосов
/ 04 декабря 2010

В библиотеке boost::thread есть ли какой-либо механизм для управления количеством потоков (максимум), запущенных одновременно?

В моем случае было бы наиболее удобно запускать все потоки N одновременно (N может быть сотнями или несколькими тысячами):

std::vector<boost::thread*> vec;
for (int i = 0; i < N; ++i) {
   vec.push_back(new boost::thread(my_fct));
}
// all are running, now wait for them to finish:
for (int i = 0; i < N; ++i) {
  vec[i]->join();
  delete vec[i];
}

Но я хочу, чтобы Boost прозрачно установил максимум, скажем, 4 потока, работающих одновременно. (У меня 8-ядерный компьютер, поэтому я не должен запускать более 4-х одновременно).

Конечно, я мог бы позаботиться о запуске только 4 одновременно, но решение, о котором я спрашиваю, было бы более прозрачным и наиболее удобным.

Ответы [ 3 ]

3 голосов
/ 04 декабря 2010

Не думаю, что в Boost.Thread это встроено, но вы можете наложить Boost.Threadpool (не официальную библиотеку) на Boost.Thread, и это позволяет вам контролировать количество потоков с помощью SizePolicy.

По умолчанию используется пул фиксированного размера , который вам нужен - укажите начальный (и текущий) счетчик потоков в конструкторе threadpool.

3 голосов
/ 04 декабря 2010

Похоже, что вы действительно хотите, чтобы когда-либо было только 4 потока, каждый из которых обрабатывал бы множество заданий .

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

Этоспособ избежать накладных расходов на создание большого количества потоков и поддерживать тот же уровень параллелизма.

1 голос
/ 04 декабря 2010

Вы можете создать блокировку, которую сможете получить только n раз.Затем каждый поток должен получить блокировку (блокировку) перед обработкой.

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