如何在任何给定时间仅在线程池中使用特定数量的线程

时间:2010-03-10 03:34:29

标签: c# multithreading c++-cli threadpool

我发现this question在学习ThreadPool的基础知识时非常有用。

现在我的问题在于使用ThreadPool来完成一系列“任务”,比如Fibonacci类,但是想要在任何时候最多执行 n 个任务,或者基本上将这些任务限制为在ThreadPool中执行最多 n 个线程,并在执行任务完成时生成新线程。

这是否可以使用for循环,任务计数器,然后使用WaitHandle :: WaitAny()。

或者更确切地说这是一个糟糕的实现,我应该尝试其他多线程方法吗?

更新

重新标记为c ++ - cli,而不是c ++。

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

我认为你会发现semaphore非常适合这种情况。

信号量将使您能够以良好的线程安全方式管理对资源(即线程池)的访问。

但请注意,线程池实际上是用于轻量级处理 - 而不是很多繁重的工作。如果你计划做一些真正计算密集的事情,你可以考虑.NET中的一些PFX(并行框架扩展?),或管理你自己的工作线程。

答案 2 :(得分:0)

正如其他人所指出的,SetMaxThreads会在C#中做到这一点......

对于C ++:在MFC中没有ThreadPool,但有几个实现可用。有一个Threadpool的posix版本,然后有一个提升友好ThreadPool。大多数实现应该有一种方法来限制可以同时运行的线程数,但是您必须检查文档。

答案 3 :(得分:0)

最简单的方法是将ThreadPool包装在自己的类中。将作业提交到包装器并将它们存储在队列中。如果运行的“作业”数量少于所需数量,请向ThreadPool提交一个“作业”。完成每个作业后,向包装器发出已完成的信号,并将队列中的下一个作业排队。

这样,您可以限制ThreadPool的使用,而不会影响任何其他代码。

我不确定这是否足够清楚?