Как использовать только определенное количество потоков в пуле потоков в любой момент времени - PullRequest
1 голос
/ 10 марта 2010

Я нашел этот вопрос , который был очень полезен при изучении основ ThreadPool.

Теперь мои вопросы заключаются в использовании ThreadPool для ряда «задач», таких как класс Фибоначчи, но при желании иметь максимально n число этих задач, выполняемых одновременно, или в основном ограничивая эти задачи выполняются в ThreadPool максимально до n потоков и порождают новые по мере выполнения задач.

Это выполнимо, используя цикл for, счетчик задач, а затем WaitHandle :: WaitAny ().

Или, скорее, это будет плохая реализация, и мне следует попробовать какой-нибудь другой многопоточный подход?

Обновление:

Повторно помечен как c ++ - cli, а не c ++.

Ответы [ 4 ]

1 голос
/ 10 марта 2010

Поддерживается через метод SetMaxThreads:

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.setmaxthreads%28VS.80%29.aspx

0 голосов
/ 10 марта 2010

Вероятно, самое простое, что нужно сделать - это обернуть ThreadPool в собственный класс. Отправляйте задания в свою оболочку и сохраняйте их в очереди. Если у вас меньше нужного количества запущенных «заданий», отправьте одно в ThreadPool. Когда каждое из ваших заданий выполнено, сообщите обертке, что оно выполнено, и оно может поставить в очередь следующее задание в вашей очереди.

Таким образом, вы ограничиваете использование ThreadPool, не затрагивая другой код.

Я не уверен, достаточно ли это ясно?

0 голосов
/ 10 марта 2010

Как уже отмечали другие SetMaxThreads сделает это на C # ...

Для C ++: в MFC нет ThreadPool, но есть несколько реализаций, доступных там. Существует posix-версия Threadpool , а затем есть дружественный буст ThreadPool . В большинстве реализаций должен быть способ ограничить количество потоков, которые могут выполняться одновременно, но вам придется проверять документацию.

0 голосов
/ 10 марта 2010

Я думаю, вы найдете семафор , который идеально подходит для этого.

Семафор позволит вам управлять доступом к ресурсу (то есть пулу потоков) приятным, поточно-ориентированным способом.

Обратите внимание, однако, что пул потоков действительно для легкой обработки - не много тяжелой работы. Если вы планируете делать некоторые действительно сложные вычислительные операции, вы можете рассмотреть некоторые из PFX (параллельные расширения платформы?) В .NET или управлять своими собственными рабочими потоками.

...