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一个简单wait的 clang 和 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 回答