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

der*_*khh 23 linux multithreading boost c++11

问题本身的描述非常简单.我正在测试C++ 11和boost :: thread库中std :: 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;
}
Run Code Online (Sandbox Code Playgroud)

给我不同的结果:

0
4
Run Code Online (Sandbox Code Playgroud)

这是为什么?

PS:gcc包的版本是4.6.2-1.fc16(x86_64).我正在使用

g++ test.cc -Wall -std=c++0x -lboost_thread-mt -lpthread
Run Code Online (Sandbox Code Playgroud)

der*_*khh 20

在查看/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; }
Run Code Online (Sandbox Code Playgroud)

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


Bri*_*ain 6

您的目标支持您的编译器安装boost所使用的方法,而您的boost编译器的安装不支持您的目标的此功能.

TFM说:

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

编辑:划伤,反转它.

EDIT2:此功能存在于主干上,但在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;
Run Code Online (Sandbox Code Playgroud)

  • @derekhh的确,gcc 4.6.x中的C++ 11支持显然是"正在进行的工作_(在编译器发布时)_"; 当实际值未知时,标准明确地使`0`成为可接受的回退值,并且gcc 4.6.x利用了这一点.gcc 4.7中的C++ 11支持要好得多,它确实为`std :: thread :: hardware_concurrency()`提供了准确的值. (6认同)