我想在一个线程中等待两个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
}
}
答案 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
}
}