C++ Handle std::thread::hardware\u concurrency()

C++ Handle std::thread::hardware\u concurrency(),c++,multithreading,c++11,g++,version,C++,Multithreading,C++11,G++,Version,在我的aboutstd::thread中,有人建议我使用std::thread::hardware\u concurrency()。我在某个地方读到(我找不到它,看起来像是本地的代码库或其他东西),这个特性没有在4.8之前的g++版本中实现 事实上,我和用户处于相同的受害者位置。函数只返回0。我在答案中找到了一个用户实现。欢迎评论这个答案是否正确 所以我想在我的代码中这样做: unsinged int cores_n; #if g++ version < 4.8 cores_n = my

在我的about
std::thread
中,有人建议我使用
std::thread::hardware\u concurrency()
。我在某个地方读到(我找不到它,看起来像是本地的代码库或其他东西),这个特性没有在4.8之前的g++版本中实现

事实上,我和用户处于相同的受害者位置。函数只返回0。我在答案中找到了一个用户实现。欢迎评论这个答案是否正确

所以我想在我的代码中这样做:

unsinged int cores_n;
#if g++ version < 4.8
 cores_n = my_hardware_concurrency();
#else
 cores_n = std::thread::hardware_concurrency();
#endif
unsinged int cores\n;
#如果g++版本<4.8
cores\u n=我的硬件\u并发();
#否则
cores_n=std::thread::hardware_concurrency();
#恩迪夫

然而,我可以找到一种方法来实现这个结果。我该怎么办?

基于Joachim提供的常见预定义宏,我做了:

int p;
#if __GNUC__ >= 5 || __GNUC_MINOR__ >= 8 // 4.8 for example
  const int P = std::thread::hardware_concurrency();
  p = (trees_no < P) ? trees_no : P;
  std::cout << P << " concurrent threads are supported.\n";
#else
  const int P = my_hardware_concurrency();
  p = (trees_no < P) ? trees_no : P;
  std::cout << P << " concurrent threads are supported.\n";
#endif
intp;
#例如,如果uuu GNUC_uuu>=5 | | uuu GNUC_uuuminor_uuuuuuu>=8//4.8
const int P=std::thread::hardware_concurrency();
p=(树木数量std::cout除了使用:Check如果
std::thread::hardware\u concurrency()
返回零,则表示该功能尚未实现

unsigned int hardware_concurrency()
{
    unsigned int cores = std::thread::hardware_concurrency();
    return cores ? cores : my_hardware_concurrency();
}
您可能会受到(GPL v2许可)的启发来实现
my\u硬件\u并发()

自动我的硬件\u并发()
{
std::ifstream cpuinfo(“/proc/cpuinfo”);
返回std::count(std::istream_迭代器(cpuinfo),
std::istream_迭代器(),
std::字符串(“处理器”);
}

阅读可能会有所帮助,尤其是关于。即使实现了
硬件\u并发性
,也不能将其作为内核数量的直接映射。这就是标准所说的返回值——硬件线程上下文的数量。接着是状态-该值仅应被视为提示,如果您的机器启用了超线程,则返回的值完全可能是内核数的2倍。如果你想要一个可靠的答案,你需要使用你的操作系统提供的任何设施。我正在阅读链接,谢谢Joachim@我链接的答案没有提到这一点,很好。是的,我也喜欢!然而,我还没有检查,但它看起来不错。谢谢谢谢你,丹尼尔。URL末尾有一个额外的括号。现在,由于您的评论,链接是正确的。干杯
auto my_hardware_concurrency()
{
    std::ifstream cpuinfo("/proc/cpuinfo");

    return std::count(std::istream_iterator<std::string>(cpuinfo),
                      std::istream_iterator<std::string>(),
                      std::string("processor"));
}