【问题标题】:How to only use a specific amount of threads in the threadpool at any given time如何在任何给定时间仅使用线程池中的特定数量的线程
【发布时间】:2010-03-10 13:43:16
【问题描述】:

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

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

使用 for 循环、任务计数器和 WaitHandle::WaitAny() 是否可行?

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

更新:

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

【问题讨论】:

  • 这个问题对 C++ 有效吗? C++ 中还没有“开箱即用”的线程池实现,因此除非您使用的是第 3 方库,否则它取决于您使用的线程池库。

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


【解决方案1】:

【讨论】:

  • 这如何与在我的程序中从 .NET 框架生成的异步线程进行交互?它也“计算”那些吗?或者只是我创建和排队的工作项?
【解决方案2】:

我想你会发现semaphore 非常适合这个。

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

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

【讨论】:

    【解决方案3】:

    正如其他人指出的那样,SetMaxThreads 将在 C# 中实现...

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

    【讨论】:

    • 哪些线程与该计数相反?只有我提交的工作项?
    • 是的,每当您将项目添加到 ThreadPool 时,它要么“立即”在新线程中执行,要么排队等待执行,直到有线程可用。
    【解决方案4】:

    可能最简单的做法是将 ThreadPool 包装在您自己的类中。将作业提交到包装器并将它们存储在队列中。如果您运行的“作业”数量少于所需数量,请向 ThreadPool 提交一个。当你的每一项工作都完成后,通知包装器它已经完成,它可以在你的队列中排队下一个工作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多