gpt4 book ai didi

c++ - std::future::wait 应该使用这么多 CPU 吗?有没有更高效的调用?

转载 作者:IT老高 更新时间:2023-10-28 12:49:03 26 4
gpt4 key购买 nike

编辑:tl;dr -- 这个问题似乎仅限于一小部分操作系统/编译器/库组合,现在在 GCC Bugzilla 中被跟踪为 Bug 68921感谢 @JonathanWakely .

我正在等待 future ,我注意到 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 <future>
#include <iostream>
#include <thread>
#include <unistd.h>

int main() {
std::promise<void> 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 <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
#include <unistd.h>

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<std::mutex> lock(m);
done = 1;
}
cv.notify_all();
});

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

t.join();
return 0;
}

我的基于 std::future 的代码有什么问题,还是我的 libstdc++ 中的实现有那么糟糕?

最佳答案

不,当然不应该这样做,这是实现中的一个错误,而不是 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 中修复

关于c++ - std::future::wait 应该使用这么多 CPU 吗?有没有更高效的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34259429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com