提升:两个工作线程,睡觉主线程,直到它们都完成

时间:2012-08-14 05:53:20

标签: c++ multithreading boost boost-thread

我使用Boost线程编写了一个程序。我已经分配了两个缓冲区(每个工作线程一个)来存储它们要处理的一些信息。他们坐下等待缓冲区出现的东西,然后他们处理它并将结果放到不同的缓冲区。我的缓冲区实现是线程安全的。目前,我有主线程忙等待,直到缓冲区大小为零,但这是非常低效的,因为它必须继续请求控制缓冲区,然后检查大小。我想要一种睡眠主线程的方法,直到BOTH工作线程发出信号表明它们已经完成。我很确定这可以使用boost::condition_variable来实现,但我不确定如何使用两个工作线程来完成此操作。

非常感谢。

编辑 - 此外,boost::barrier也适用吗?

2 个答案:

答案 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, 托