线程同步:等待两个bool变量

时间:2016-04-07 11:12:53

标签: c++ multithreading thread-safety thread-synchronization

我想在一个线程中等待两个bool变量为真。他们在不同的地方改变。我可以在我的项目中使用boost,但不能在C ++ 11中使用boost。 我确实找到了有关如何使用互斥锁和条件变量的信息,但我不确定是否可以等待两个互斥锁。 这是我程序的一些伪代码。

bool job1_dataready, job2_dataready;

//t1:
void job1()
{
   //do stuff
   job1_dataready = true;
}

//t2:
void job2()
{
   //do stuff
   job2_dataready= true;
}

main()
{
 boost::thread t1(job1);
 boost::thread t1(job2);

 if(job1_dataready&& job2_dataready)
 {
    //do stuff with data from both jobs
 }

}

4 个答案:

答案 0 :(得分:6)

从我看到的,你不需要bool变量,改为使用std::thread::join

main() {
    std::thread t1(job1);
    std::thread t1(job2);
    t1.join();
    t2.join();
    // do jobs after threads t1 and t2 finish working
}

答案 1 :(得分:1)

你会阻塞条件变量,在被唤醒时检查你的布尔值,然后返回等待或继续处理。你的线程在设置了布尔标志后会发出条件变量的信号。当然,所有都有适当的互斥锁定。你可以在无数条件下等待,只需在阻止条件后醒来时检查。

答案 2 :(得分:0)

在这种简单的情况下,只需按顺序锁定它们就可以等待两个互斥锁。首先从线程1锁定互斥锁,然后从线程2锁定互斥锁。如果线程2在线程1之前完成,则主线程在锁定互斥锁2时不会阻塞。

但请注意,这是您的问题的答案,但不是您问题的解决方案。原因是你与互斥锁有竞争条件:主线程可能会在工作线程开始之前锁定互斥锁。因此,虽然Andrei R.s响应(std::thread::join)不是直接答案,但它是正确的解决方案。

答案 3 :(得分:0)

如果您打算在相应的线程终止之前设置两个bool,那么只有join两个线程的Andrei R.'s solution绝对是最好的方法。但是,如果您的线程在达到dataready点后仍然继续工作,并且因此尚未终止,则需要采用不同的方法。在这种情况下,您可以使用两个std::future / std::promise个对象,它们看起来像这样:

std::promise<bool> job1_dataready, job2_dataready;

//t1:
void job1()
{
  //do stuff
  job1_dataready.set_value(true); // The value doesn't actually matter
  //do more stuff
}

//t2:
void job2()
{
  //do stuff
  job2_dataready.set_value(true);
  //do more stuff
}

main()
{
  std::future<bool> job1_future = job1_dataready.get_future();
  std::future<bool> job2_future = job2_dataready.get_future();

  boost::thread t1(job1);
  boost::thread t2(job2);

  job1_future.wait();
  job2_future.wait();
  if (job1_future.get() && job2_future.get()) // True unless something was aborted
  {
    //do stuff with data from both jobs
  }
}