【问题标题】:Handle std::thread::hardware_concurrency()处理 std::thread::hardware_concurrency()
【发布时间】:2015-01-15 19:14:02
【问题描述】:

在我的question 关于std::thread 中,有人建议我使用std::thread::hardware_concurrency()。我在某处读到(我找不到它,看起来像是本地代码存储库或其他东西),4.8 之前的 g++ 版本没有实现此功能。

事实上,我和this用户处于同一个受害者位置。该函数将简单地返回 0。我在this 中找到了一个用户实现的答案。欢迎评论这个答案好不好!

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

unsinged int cores_n;
#if g++ version < 4.8
 cores_n = my_hardware_concurrency();
#else
 cores_n = std::thread::hardware_concurrency();
#endif

但是,我可以找到实现此结果的方法。我该怎么办?

【问题讨论】:

  • 阅读online documentation 可能会有所帮助,尤其是关于common pre-defined macros
  • 即使实现了hardware_concurrency,也不能将其作为对核心数量的直接映射。这就是标准所说的返回 - 硬件线程上下文的数量。并继续说明 - 此值仅应被视为提示 如果您的机器启用了超线程,则返回的值完全有可能是核心数的 2 倍。如果您想要一个可靠的答案,您需要使用您的操作系统提供的任何工具。
  • 我正在阅读链接,谢谢 Joachim! @Praetorian 我链接的答案没有提到这一点,好点。

标签: c++ multithreading c++11 g++ version


【解决方案1】:

除了使用 GCC Common Predefined Macros 之外,还有另一种方法:检查 std::thread::hardware_concurrency() 是否返回零,表示该功能(尚未)实现。

unsigned int hardware_concurrency()
{
    unsigned int cores = std::thread::hardware_concurrency();
    return cores ? cores : my_hardware_concurrency();
}

您可能会受到awgn's source code(GPL v2 许可)的启发来实施my_hardware_concurrency()

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"));
}

【讨论】:

  • 是的,我也喜欢!但是,我没有检查,但它似乎很好。谢谢!
  • 谢谢@Daniel。 URL 末尾有一个额外的括号。由于您的评论,现在链接是正确的。干杯
【解决方案2】:

基于常见的预定义宏link,由 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

【讨论】:

    猜你喜欢
    • 2012-01-22
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    相关资源
    最近更新 更多