最佳OS便携式线程池库

时间:2012-04-14 14:28:13

标签: c++ multithreading pooling

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

  1. 什么是最好的OS便携式线程池库?或者我应该自己创作?
  2. 与物理处理器核心相比,是否有更多的积分?

5 个答案:

答案 0 :(得分:4)

  1. 新的C ++ 11标准具有线程支持,因此如果您的编译器支持它,您应该更喜欢它。否则,有Boost.Thread。这些不是线程池库,但您可以在它们之上构建一个线程池。
  2. 取决于您尝试解决的问题。如果要并行运行 n 任务,则必须启动 n 线程,无论您拥有多少处理器核心(多线程在处理器生成多个核心之前很流行,并且通常数百个线程已经并行运行,所以还有一些并不重要。另一方面,线程创建很昂贵,因此不应为每个短期后台线程创建新线程。在C ++ 11中,您可以将future用于此类后台任务。

答案 1 :(得分:1)

  1. 如果可能,最好的方法是使用抽象线程的库,而不是专注于任务,如英特尔TBB / Microsoft PPL。他们还提供像parallel_for这样的并行算法,它们易于使用且功能强大。它们还提供了解决其他不同问题的可能性,例如减少操作,递归的东西...

  2. 一般来说,这并不好,因为线程和线程之间的过多任务切换会降低性能。相反,应该尝试--TBB和PPL这样做 - 通过应用任务窃取模式来分割不同线程上的工作(参见TBB维基页面)。只有一些线程必须等待,这样才会浪费CPU处理时间,这是唯一一个小额超额认购的好地方。

答案 2 :(得分:1)

1)我也会选择Boost。

2)也许吧。如果任务中存在任何锁定或I / O阻塞,则可能需要大量线程。如果任务受CPU约束,那么说起来就更难了。如果任务没有读取,特别是写入,那么大量的数据并没有在运行时使那么多的缓存失效,大量的线程似乎实际上略微提高了性能 - 如果只是添加到一个变量中,200个线程获得比8更多的工作。在更常见的情况下,使用大量内存的CPU绑定任务往往会弄脏所有缓存,很多线程(例如200)通常导致吞吐量下降20由于缓存刷新而导致-50%。

答案 3 :(得分:0)

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

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

答案 4 :(得分:-2)

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