请使用以下代码:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
using namespace std;
int main() {
mutex m;
condition_variable c;
bool fired = false;
int i = 0;
// This thread counts the times the condition_variable woke up.
// If no spurious wakeups occur it should be close to 5.
thread t([&]() {
unique_lock<mutex> l(m);
while (!fired) {
c.wait_for(l, chrono::milliseconds(100));
++i;
}
});
// Here we wait for 500ms, then signal the other thread to stop
this_thread::sleep_for(chrono::milliseconds(500));
{
unique_lock<mutex> l(m);
fired = true;
c.notify_all();
cout << i << endl;
}
t.join();
}
现在,当我使用clang++ -std=c++11 -pthread foo.cpp
构建它时,一切都很好,它会在我的机器上输出4
。当我使用g++ -std=c++11 -pthread foo.cpp
构建它时,我会在每个时间获得非常大的,例如81513
。我意识到虚假唤醒的数量是不确定的,但我很惊讶地看到它如此之高。
其他信息:当我用简单wait_for
替换wait
clang和g ++输出0
时。
这是g ++中的错误/功能吗?为什么它甚至不同于铿锵?我可以让它表现得更合理吗?
另外:gcc version 4.7.3 (Debian 4.7.3-4)
。
答案 0 :(得分:1)
我设法让g ++ - 4.8运行,问题就消失了。非常奇怪,似乎是g ++ - 4.7.3中的一个错误,虽然我无法在另一台机器上重现它。