为什么使用std::thread::hardware_concurrency()和boost::thread::hardware_concurrency()会有差异?

24

问题本身的描述非常简单。我正在测试C++11中std::thread库和boost::thread库之间的差异。

它们的输出分别是:

#include <iostream>
#include <thread>
#include <boost/thread.hpp>

int main() {
  std::cout << std::thread::hardware_concurrency() << std::endl;
  std::cout << boost::thread::hardware_concurrency() << std::endl;
  return 0;
}

给我不同的结果:

0
4
为什么会这样呢?
PS:gcc软件包的版本是4.6.2-1.fc16(x86_64)。我正在使用。
g++ test.cc -Wall -std=c++0x -lboost_thread-mt -lpthread
2个回答

22

在查看 /usr/include/c++/4.6.2/thread 后,可以发现其实现是:

// Returns a value that hints at the number of hardware thread contexts.
static unsigned int
hardware_concurrency()
{ return 0; }

问题解决了。这只是gcc 4.6.2中尚未实现的另一个功能。


6

你安装的boost编译器支持所需方法以适用于你的目标,然而你的编译器不支持此功能。

TFM说:

当前系统上可用的硬件线程数(例如CPU或核心或超线程单元数),如果没有此信息,则为0。

编辑:删掉它,反过来。

编辑2:此功能在主干中存在,但在4.6.2中不存在:

~/tmp/gcc-4.6.2/libstdc++-v3/src> wc -l thread.cc
104 thread.cc
~/tmp/gcc-4.6.2/libstdc++-v3/src> grep concurrency thread.cc | wc -l
0
~/tmp/gcc-4.6.2/libstdc++-v3> grep -C 2 VERIFY testsuite/30_threads/thread/members/hardware_concurrency.cc

  // Current implementation punts on this.
  VERIFY( std::thread::hardware_concurrency() == 0 );

  return 0;

但实际上,boost::thread可以显示正确的信息4,而c++11给我0... - derekhh
@derekhh: 很有可能你的C++11实现只是一个框架,实际上并不可用。 - Daniel
g++ 4.6.2 面向 linux-x86_64,还是...? - Brian Cain
@BrianCain:是的,它是x86_64。 - derekhh
更多关于它的来源信息:http://gcc.gnu.org/viewcvs/trunk/libstdc%2B%2B-v3/src/thread.cc?view=log - Brian Cain
6
@derekhh 在gcc 4.6.x中的C++11支持显然是一个“正在进行中的工作(在编译器发布时)”;标准明确规定当真实值未知时,0是可接受的后备值,而gcc 4.6.x利用了这一点。GCC 4.7中的C++11支持更好,它确实为std::thread::hardware_concurrency()提供了准确的值。 - snogglethorpe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接