Планирование огромного количества потоков, так что только 4 выполняются параллельно - PullRequest
0 голосов
/ 11 июля 2011

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

Можно ли добиться этого с помощью pthreads, например, с помощью функций планирования pthread?Как бы вы это сделали?

С уважением,

Никто

РЕДАКТИРОВАТЬ Дополнительная информация: Каждый поток самостоятельно выбирает работу из пула задач и отправляетсяна определенный момент.Мне нужно 100 потоков, чтобы собрать в определенную точку выполнения программы, которая не может быть рассчитана параллельно.Когда вычисления завершены, потоки должны быть разбужены и продолжаться.Чтобы сделать это эффективным, я должен избежать того, чтобы планировщик тратил время на переключение между 100 потоками вместо 4.

Ответы [ 4 ]

2 голосов
/ 11 июля 2011

Просто используйте семафор с начальным количеством 4?

0 голосов
/ 14 июля 2011

Я не знаю, как это сделать с помощью функций pthread, но у меня есть идея:

Я бы реализовал это, добавив некоторый интеллект в пул потоков / пул задач, чтобы подсчитывать количество активных потоков и сделать доступным только 4 - количество активных потоков одновременно. Это можно сделать, имея очередь ожидания, готовую очередь и активную очередь (или просто активный счет). Задачи будут извлекать данные из очереди готовности, а пул потоков будет только условно переносить задачи из очереди ожидания в очередь готовности.

0 голосов
/ 11 июля 2011
  • Инициализировать глобальную переменную для числа потоков, которые будут выполняться одновременно.
  • Когда поток хочет выполнить работу, он получает слот.Используя мьютекс и переменную условия, он ожидает, пока slots_available> 1. Затем уменьшает slots_available, освобождает мьютекс и продолжает свою работу.
  • Когда поток завершил свою работу, он освобождает слот, блокируя мьютекс иувеличивая slots_available.Он сигнализирует всем потокам, ожидающим переменную условия, чтобы они могли проснуться и посмотреть, находится ли slots_available> 1.
  • См. https://computing.llnl.gov/tutorials/pthreads/#Mutexes конкретные вызовы библиотеки pthread для использования выше.
0 голосов
/ 11 июля 2011

Вы всегда можете запустить 4 за раз, назначив их группе потоков, а затем ожидая объединения всех в группе потоков.Но я думаю, что для разработки действительно полезного ответа требуется больше информации.

...