我正在为兼容POSIX的系统和Windows(R)开发一个C ++程序,并且想知道:
答案 0 :(得分:4)
答案 1 :(得分:1)
如果可能,最好的方法是使用抽象线程的库,而不是专注于任务,如英特尔TBB / Microsoft PPL。他们还提供像parallel_for
这样的并行算法,它们易于使用且功能强大。它们还提供了解决其他不同问题的可能性,例如减少操作,递归的东西...
一般来说,这并不好,因为线程和线程之间的过多任务切换会降低性能。相反,应该尝试--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