我目前需要一个简单而有效的线程池实现。我在这里和Google上都进行了搜索,发现了许多有趣的链接,但是到目前为止,我所发现的任何内容似乎都不适合。我在网络上发现的大多数实现要么太复杂,要么缺少我需要的一些关键功能。

另外,我也不想使用我不理解的代码,所以我决定自己编写代码(有时重新发明轮子可以帮助我在知识和经验上不断前进)。我当然理解线程池背后的基本思想,但是一些实现细节对我来说仍然不清楚。这可能是因为我需要的线程池有点特殊。让我描述一下。我有一个在特定(大型)缓冲区上完成数十万次的任务。我已经测量出,如果我使用线程来执行此任务,性能会更好-缓冲区被拆分为子缓冲区,每个线程在子缓冲区上执行其任务并返回结果。然后将所有线程的所有结果加在一起,为我提供最终解决方案。

但是,由于经常执行此操作,因此我正在浪费宝贵的时间,因为创建了这么多线程(由于线程创建所带来的开销)。因此,我希望有一个可以执行此任务的线程池,而不是每次都创建一组新的线程。

更清楚地说,这是我到目前为止所拥有的:

  • 将缓冲区拆分为N个大小相同的子缓冲区
  • 为每个子缓冲区创建一个线程,然后在子缓冲区
  • 上运行
  • 等待所有线程完成(WaitForMultipleObjects),将结果加在一起并销毁线程
  • 重复

  • 我想实现的是:
  • 将缓冲区拆分为N个大小相同的子缓冲区
  • 将每个子缓冲区分配给线程池中的一个线程(该线程恰好具有N个线程)
  • 线程完成后,让其进入休眠状态,直到另一个任务准备就绪为止
  • 当所有线程完成(并进入休眠状态)后,将它们产生的结果加在一起
  • 通过唤醒线程来重复并为它们分配新任务

  • 如您所见,这有点特殊的线程池,因为我需要等待线程完成。基本上,我想摆脱所有创建线程的开销,因为该程序经历了数十万次迭代,因此它可以在整个生命周期内创建和销毁数百万个线程。好消息是我根本不需要线程之间的任何同步,它们都可以得到自己的数据并保存结果。但是,我必须等到所有线程完成并且有最终解决方案为止,因为下一个任务取决于上一个任务的结果。

    我的主要问题是线程管理:
  • 如何使我的线程“休眠”并在新任务准备好后将其唤醒?
  • 我如何等待所有线程完成?

  • 我将不胜感激。如果我不够清楚,也可以随时提出问题。谢谢!

    最佳答案

    对我而言,与线程通信的首选方式是通过条件变量。因为您可以定义所需的条件并在更改时发出信号。在您的情况下,您可以将与传递子缓冲区的队列组合在一起,以便每个线程在队列为空时等待。然后可以将结果放在另一个队列上,在该队列中,管理队列正在等待,直到所有线程都将结果发布到队列中为止(对此请求的引用与子缓冲区一起作为请求传递)。

    关于c++ - 实现一个简单的线程池,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9580713/

    10-11 22:13
    查看更多