condition_variable在C ++中等待

时间:2014-10-09 15:00:13

标签: c++

我一直在尝试condition_variable ::等等,我正在使用:

 template< class Predicate >
 void wait( std::unique_lock<std::mutex>& lock, Predicate pred );

但是当我执行它时我有点困惑。这是一个简单的例子:

 std::condition_variable cv;
 std::mutex cv_m;
 bool flag = false;

 void waits()
 {
   std::unique_lock<std::mutex> lk(cv_m);
   std::cerr << "Waiting... \n";

   cv.wait(lk,[]() {return flag == true;});
   std::cerr << "...finished waiting " << flag << std::endl;
 }

 void signals()
 {
    //std::this_thread::sleep_for(std::chrono::seconds(1));

   std::unique_lock<std::mutex> lk(cv_m);
   std::cout <<"Counting...."<< std::endl;
   flag = true;
     for(int i = 0; i < 5; i++) {
       std::cout << i << std::endl;
   }

  cv.notify_all();

 }

 int main()
 {
   std::thread t1(waits), t2(waits), t3(waits), t4(signals);
   t1.join();
   t2.join();
   t3.join();
   t4.join();

   return 0;
 }

如果我用

延迟信号()
  std::this_thread::sleep_for(std::chrono::seconds(1));

它按预期工作,而如果我把上面的行放在注释下输出它是一团糟。 等待条件是否应该等待执行waits()?为什么每次输出都需要延迟输出,大部分时间都搞砸了?

输出的一个例子

 Waiting... 
 Counting....
 0
 1
 2
 3
 4
 Waiting... 
 ...finished waiting 1
 Waiting... 
 ...finished waiting 1
 ...finished waiting 1

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

你有竞争条件。 t4有可能获取互斥锁并在其他线程有机会进入等待之前运行完成。因此他们错过了信号。

您需要进行同步,以便t1t2t3t4开始之前进入等待状态。每当睡眠似乎解决了线程代码中的问题时,您可能会遇到需要真正同步才能正确修复的竞争条件。