2010-03-10 2 views
1

Я нашел this question, что было очень полезно при изучении основ ThreadPool.Как использовать определенное количество потоков в threadpool в любой момент времени

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

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

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

Update:

Retagged в C++ - кли, а не C++.

+0

Этот вопрос действительно для C++? В C++ не существует «готовых» реализаций потоков в C++, поэтому, если вы не используете стороннюю библиотеку, это зависит от того, какую библиотеку threadpool вы столкнулись. – Kiril

ответ

1

Он поддерживает его с помощью метода SetMaxThreads:

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

+1

Как это взаимодействует с асинхронными потоками, порожденными в моей программе из платформы .NET? Считает ли он это? Или просто рабочие элементы, которые я создаю и размещаю в очереди? –

0

Я думаю, вы найдете semaphore отлично подходит для этого.

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

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

0

Как уже отмечалось SetMaxThreads будут делать это в C# ...

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

+0

Какие темы идут против этого счета? Только рабочие предметы, которые я отправляю? –

+0

Да, всякий раз, когда вы добавляете элемент в ThreadPool, он либо сразу «запускается» в новом потоке, либо ставится в очередь для выполнения до тех пор, пока поток не будет доступен. – Kiril

0

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

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

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

Смежные вопросы