当前位置:  开发笔记 > 编程语言 > 正文

应该std :: future ::等待使用这么多CPU吗?有更高性能的电话吗?

如何解决《应该std::future::等待使用这么多CPU吗?有更高性能的电话吗?》经验,为你挑选了1个好方法。

编辑:tl; dr - 此问题似乎仅限于一小组 OS /编译器/库组合,现在由于@JonathanWakely而在GCC Bugzilla中作为Bug 68921进行跟踪.

我正在等待未来,我注意到top显示100%的CPU使用率并strace显示稳定的futex呼叫流:

...
[pid 15141] futex(0x9d19a24, FUTEX_WAIT, -2147483648, {4222429828, 3077922816}) = -1 EINVAL (Invalid argument)
...

这是在Linux 4.2.0(32位i686)上,使用gcc 5.2.1版编译.

这是我最不可行的示例程序:

#include 
#include 
#include 
#include 

int main() {
  std::promise p;
  auto f = p.get_future();

  std::thread t([&p](){
    std::cout << "Biding my time in a thread.\n";
    sleep(10);
    p.set_value();
  });

  std::cout << "Waiting.\n";
  f.wait();
  std::cout << "Done.\n";

  t.join();
  return 0;
}

这是编译器调用(没有相同的行为-g):

g++ --std=c++11 -Wall -g -o spin-wait spin-wait.cc -pthread

有更高性能的选择吗?

下面是一个使用逻辑上类似的计划std::condition_variable似乎进行好:

#include 
#include 
#include 
#include 
#include 

int main() {
  bool done = 0;
  std::mutex m;
  std::condition_variable cv;

  std::thread t([&m, &cv, &done](){
    std::cout << "Biding my time in a thread.\n";
    sleep(10);
    {
      std::lock_guard lock(m);
      done = 1;
    }
    cv.notify_all();
  });

  std::cout << "Waiting.\n";
  {
    std::unique_lock lock(m);
    cv.wait(lock, [&done]{ return done; });
  }
  std::cout << "Done.\n";

  t.join();
  return 0;
}

我是否在使用std::future基于代码的代码时出错了,或者我的实现是否libstdc++那么糟糕?



1> Jonathan Wak..:

当然不应该这样做,这是实施中的一个错误,而不是一个属性std::future.

现在这是https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68921 - 保持呼叫的循环futex(2)__atomic_futex_unsigned::_M_load_and_test_until

它看起来像syscall函数的一个简单的缺失参数,所以垃圾指针被传递给内核,它抱怨它不是一个有效的timespec*参数.我正在测试修复程序并将在明天提交,因此将在GCC 5.4中修复

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有