我发现this question在学习ThreadPool的基础知识时非常有用。
现在我的问题在于使用ThreadPool来完成一系列“任务”,比如Fibonacci类,但是想要在任何时候最多执行 n 个任务,或者基本上将这些任务限制为在ThreadPool中执行最多 n 个线程,并在执行任务完成时生成新线程。
这是否可以使用for循环,任务计数器,然后使用WaitHandle :: WaitAny()。
或者更确切地说这是一个糟糕的实现,我应该尝试其他多线程方法吗?
更新
重新标记为c ++ - cli,而不是c ++。
答案 0 :(得分:1)
它通过SetMaxThreads方法支持它:
http://msdn.microsoft.com/en-us/library/system.threading.threadpool.setmaxthreads%28VS.80%29.aspx
答案 1 :(得分:0)
我认为你会发现semaphore非常适合这种情况。
信号量将使您能够以良好的线程安全方式管理对资源(即线程池)的访问。
但请注意,线程池实际上是用于轻量级处理 - 而不是很多繁重的工作。如果你计划做一些真正计算密集的事情,你可以考虑.NET中的一些PFX(并行框架扩展?),或管理你自己的工作线程。
答案 2 :(得分:0)
正如其他人所指出的,SetMaxThreads会在C#中做到这一点......
对于C ++:在MFC中没有ThreadPool,但有几个实现可用。有一个Threadpool的posix版本,然后有一个提升友好ThreadPool。大多数实现应该有一种方法来限制可以同时运行的线程数,但是您必须检查文档。
答案 3 :(得分:0)
最简单的方法是将ThreadPool包装在自己的类中。将作业提交到包装器并将它们存储在队列中。如果运行的“作业”数量少于所需数量,请向ThreadPool提交一个“作业”。完成每个作业后,向包装器发出已完成的信号,并将队列中的下一个作业排队。
这样,您可以限制ThreadPool的使用,而不会影响任何其他代码。
我不确定这是否足够清楚?