最好的操作系统便携式线程池库
Best OS portable thread pool library
我正在为POSIX兼容系统和Windows(R)开发一个C++程序,并且想知道:
- 什么是最好的操作系统便携式线程池库? 还是我应该自己做?
- 是否有任何意义将比物理处理器内核更多的踏板汇集在一起?
- 新的 C++11 标准具有线程支持,因此如果您的编译器支持,您应该更喜欢它。否则,有Boost.Thread。这些不是线程池库,但您可以在它们之上构建线程池。
- 取决于您尝试解决的问题。如果你想并行运行n个任务,你必须启动n个线程,无论你有多少个处理器内核(在处理器增长多个内核之前,多线程很流行,通常数百个线程已经在并行运行,所以更多的线程并不重要)。另一方面,线程创建成本很高,因此不应为每个生存期较短的后台线程创建新线程。在 C++11 中,您可以将 futures 用于此类后台任务。
-
如果可能的话,最好的办法是使用抽象线程的库,而是专注于任务,如英特尔TBB/Microsoft PPL。它们还提供并行算法,例如易于使用且功能强大的
parallel_for
。此外,它们还提供了解决其他不同问题的可能性,例如减少操作、递归的东西...... -
通常,这并不好,因为在线程和线程旋转之间过多的任务切换会降低性能。相反,应该尝试 - 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
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- "永远"阻止线程的最简单便携式方法是什么?
- TinyThread计数器 - 便携式c++0和c++11线程间通信变得简单
- 在 C++11 中设置 std::线程优先级的便携式方法
- 最好的操作系统便携式线程池库