正确使用boost :: wait boost :: condition

时间:2011-07-17 13:53:16

标签: c++ boost mutex

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?

2 个答案:

答案 0 :(得分:6)

假设您使用的是最近版本的提升,boost::conditionboost::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。这样:

  1. 不使用递归互斥锁。请确保您不要尝试递归锁定它。
  2. 使用互斥锁保护对容器condition_variable的访问权限。
  3. 在你的等待中使用一段时间来防止虚假的唤醒。
  4. 使用便宜得多的condition_variable_any而不是更昂贵(更灵活){{1}}。在你的例子中,我没有看到后者的需要。

答案 1 :(得分:0)

正确 - 你需要一个互斥量;它的目的是确保多个消费者与您的一个生产者保持同步。

另请参阅http://www.boost.org/doc/libs/1_41_0/doc/html/thread/synchronization.html