boost::condition cond;
boost::recursive_mutex mutex;
for(;;)
{
D * d = nullptr;
while( cb.pop(d) )
{
}
boost::lock_guard<boost::recursive_mutex> lock( **mutex** );
cond.wait( **mutex** );
}
while(1)
{
getchar();
for( int i = 0 ; i < 1000 ; ++i )
{
cb.push(new D(i));
boost::lock_guard<boost::recursive_mutex> lock( **mutex** );
cond.notify_one();
}
}
我怀疑是互斥锁,我只需要互斥对象吗?
编辑:
cb是一个循环缓冲区。 我想实现一种生产者 - 消费者模式
我是否必须使用相同的互斥锁进行wait和notify_one?
答案 0 :(得分:6)
假设您使用的是最近版本的提升,boost::condition
与boost::condition_variable_any
相同,我认为这与std::condition_variable_any
相同。
如果所有这些都是真的,或者至少接近真实,那么您的代码应该编译,但如果您以cond.wait(mutex)
递归锁定mutex
来调用boost::condition_variable cond;
boost::mutex mutex;
// In one thread
for(;;)
{
D * d = nullptr;
boost::unique_lock<boost::mutex> lock( mutex );
while( cb.pop(d) )
{
}
while (cb.empty())
cond.wait( lock );
}
// In another thread
while(1)
{
getchar();
for( int i = 0 ; i < 1000 ; ++i )
{
boost::lock_guard<boost::mutex> lock( mutex );
cb.push(new D(i));
cond.notify_one();
}
}
,则可能会死锁。
我建议改为:
std
如果您的实施支持,请将boost
替换为cb
。这样:
condition_variable
的访问权限。condition_variable_any
而不是更昂贵(更灵活){{1}}。在你的例子中,我没有看到后者的需要。答案 1 :(得分:0)
正确 - 你需要一个互斥量;它的目的是确保多个消费者与您的一个生产者保持同步。
另请参阅http://www.boost.org/doc/libs/1_41_0/doc/html/thread/synchronization.html