VC ++和GCC下boost :: condition_variable的不同行为

时间:2013-04-16 18:08:35

标签: c++ multithreading boost boost-thread

在我的计算机上,在Windows 7上运行,以下代码,使用Boost 1.53在Visual C ++ 2010中编译,输出

no timeout
elapsed time (ms): 1000

使用GCC 4.8 (online link)编译的相同代码输出

timeout
elapsed time (ms): 1000

我的观点是VC ++输出不正确,它应该是timeout。 VC ++中有没有人有相同的输出(即no timeout)?如果是,那么它是boost::condition_variable的Win32实现中的错误吗?

代码是

#include <boost/thread.hpp>
#include <iostream>

int main(void) {
  boost::condition_variable cv;
  boost::mutex mx;
  boost::unique_lock<decltype(mx)> lck(mx);
  boost::chrono::system_clock::time_point start = boost::chrono::system_clock::now();
  const auto cv_res = cv.wait_for(lck, boost::chrono::milliseconds(1000));
  boost::chrono::system_clock::time_point end = boost::chrono::system_clock::now();
  const auto count = (boost::chrono::duration_cast<boost::chrono::milliseconds>(end - start)).count();
  const std::string str = (cv_res == boost::cv_status::no_timeout) ? "no timeout" : "timeout";
  std::cout << str << std::endl;
  std::cout << "elapsed time (ms): " << count << std::endl;
  return 0; 
}

1 个答案:

答案 0 :(得分:6)

如果我们阅读文档,我们会看到:

  

以原子方式调用lock.unlock()并阻止当前线程。该   线程将在通过调用this-&gt; notify_one()或通知时解除阻止   在rel_time指示的时间段之后,this-&gt; notify_all()   论证已经过去,或虚假 ...... [强调我的]

您几乎可以肯定的是,VS实现将其视为虚假唤醒,恰好在预期持续时间结束时,而其他实现将其视为超时。