次のコードを使用します。
#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++ output の両方に置き換えると0
。
これは g++ のバグ/機能ですか? なぜclangとは違うのですか?より合理的に動作させることはできますか?
また: gcc version 4.7.3 (Debian 4.7.3-4)
.