我使用Boost线程编写了一个程序。我已经分配了两个缓冲区(每个工作线程一个)来存储它们要处理的一些信息。他们坐下等待缓冲区出现的东西,然后他们处理它并将结果放到不同的缓冲区。我的缓冲区实现是线程安全的。目前,我有主线程忙等待,直到缓冲区大小为零,但这是非常低效的,因为它必须继续请求控制缓冲区,然后检查大小。我想要一种睡眠主线程的方法,直到BOTH工作线程发出信号表明它们已经完成。我很确定这可以使用boost::condition_variable
来实现,但我不确定如何使用两个工作线程来完成此操作。
非常感谢。
编辑 - 此外,boost::barrier
也适用吗?
答案 0 :(得分:2)
您也可以使用thread :: join方法。此方法将等待线程完成(线程函数返回)。
有关join的更多信息。
我认为这种障碍无法帮助你。屏障允许停止线程处理,直到所有线程都成为屏障。当所有线程都调用了barrier :: wait时,则所有线程都停止等待。
答案 1 :(得分:1)
缓冲区大小为0似乎是条件变量的谓词。该大小必须以某种方式由互斥锁保护。如果您锁定该互斥锁以更改缓冲区大小,则必须在大小为零时发出条件变量的信号。
新的wait_for_zero_size()函数必须锁定互斥锁,并在循环中查找该谓词,等待条件变量,当条件不为真时:
void buffer::wait_for_zero_size()
{
boost::mutex::scoped_lock lock( mutex_ );
while ( size_ != 0 )
condition_.wait( lock );
}
HTH, 托