最好的操作系统便携式线程池库

Best OS portable thread pool library

本文关键字:线程 便携式 操作系统      更新时间:2023-10-16

我正在为POSIX兼容系统和Windows(R)开发一个C++程序,并且想知道:

  1. 什么是最好的操作系统便携式线程池库? 还是我应该自己做?
  2. 是否有任何意义将比物理处理器内核更多的踏板汇集在一起?
  1. 新的 C++11 标准具有线程支持,因此如果您的编译器支持,您应该更喜欢它。否则,有Boost.Thread。这些不是线程池库,但您可以在它们之上构建线程池。
  2. 取决于您尝试解决的问题。如果你想并行运行n个任务,你必须启动n个线程,无论你有多少个处理器内核(在处理器增长多个内核之前,多线程很流行,通常数百个线程已经在并行运行,所以更多的线程并不重要)。另一方面,线程创建成本很高,因此不应为每个生存期较短的后台线程创建新线程。在 C++11 中,您可以将 futures 用于此类后台任务。
  1. 如果可能的话,最好的办法是使用抽象线程的库,而是专注于任务,如英特尔TBB/Microsoft PPL。它们还提供并行算法,例如易于使用且功能强大的parallel_for。此外,它们还提供了解决其他不同问题的可能性,例如减少操作、递归的东西......

  2. 通常,这并不好,因为在线程和线程旋转之间过多的任务切换会降低性能。相反,应该尝试 - TBB 和 PPL 这样做 - 通过应用任务窃取模式来拆分不同线程上的工作(请参阅 TBB wiki 页面)。小额超额订阅的唯一好处是当某些线程必须等待时,这会浪费 CPU 处理时间。

1)我也会选择Boost。

2)也许吧。如果任务中存在任何锁定或 I/O 阻塞,则可能需要大量线程。 如果任务是 CPU 密集型的,那就更难说了。 如果任务不读取,尤其是写入大量数据,因此在运行时不会使那么多缓存失效,则大量线程似乎实际上略微提高了性能 - 如果只是添加到变量中,200 个线程完成的工作比 8 个线程多一点。 在更常见的 CPU 密集型任务中,这些任务使用大量内存,因此往往会弄脏所有缓存,大量线程(例如 200)通常会导致吞吐量下降 20-50%,因为缓存刷新。

dlib 中有一个线程池工具,它允许您指定计算机上的处理内核数,然后将作业提交到线程池。 因此,如果您正在寻找一些可以轻松有效地使用多核 CPU 的东西,那么 dlib::thread_pool 可能非常有用。

还有一个示例程序,它展示了如何使用各种方法(包括 C++11 lambda 函数)将作业提交到池。 另一个好处是没有安装过程,您只需下载dlib和此示例程序并进行编译即可。 您无需安装或配置任何内容。 它只能在您提到的任何一个平台上工作。

Boost 线程是跨平台的,对于C++:http://www.boost.org/doc/libs/1_49_0/doc/html/thread.html