5

次のコードを使用します。

#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単純なwaitclang と g++ output の両方に置き換えると0

これは g++ のバグ/機能ですか? なぜclangとは違うのですか?より合理的に動作させることはできますか?

また: gcc version 4.7.3 (Debian 4.7.3-4).

4

1 に答える 1

1

g++-4.8 を実行することができたので、問題はなくなりました。g++-4.7.3 のバグのようですが、別のマシンでは再現できませんでした。

于 2013-09-06T19:33:32.980 に答える