0

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

  1. 什么是最好的操作系统可移植线程池库?还是我应该自己做?
  2. 汇集比物理处理器内核更多的胎面有什么意义?
4

5 回答 5

4
  1. 新的 C++11 标准支持线程,所以如果你的编译器支持它,你应该更喜欢它。否则,会有Boost.Thread。这些不是线程池库,但您可以在它们之上构建一个线程池。
  2. 取决于你试图解决什么问题。如果你想并行运行n 个任务,你必须启动n 个线程,无论你有多少个处理器内核(多线程在处理器增长多个内核之前很流行,通常数百个线程已经在并行运行,所以更多没那么重要)。另一方面,线程创建成本很高,因此您不应该为每个短期后台线程创建一个新线程。在 C++11 中,您可以将期货用于此类后台任务。
于 2012-04-14T14:32:30.560 回答
1

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

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

于 2012-04-14T15:12:48.123 回答
1
  1. 如果可能的话,最好的办法是使用抽象线程的库,而是专注于任务,例如 Intel TBB / Microsoft PPL。parallel_for他们还提供了易于使用且功能强大的并行算法。它们还提供了解决许多其他不同问题的可能性,比如减少操作、递归的东西......

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

于 2012-04-14T14:39:58.130 回答
1

1)我也会选择Boost。

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

于 2012-04-14T14:49:33.907 回答
-2

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

于 2012-04-14T14:32:12.513 回答