如何使boost_to_unique_lock + condition_variable一起工作?

时间:2016-05-23 12:34:22

标签: c++ boost condition-variable readwritelock

我使用std :: list来保存一些字符串,一个线程写入列表,其他一些线程从中读取(从列表中获取第一个和擦除)。这是代码:

std::list<string> list_;

boost::condition_variable cond;
boost::shared_mutex mtx;

int get_size() {
    boost::shared_lock<boost::shared_mutex> lock(mtx);
    return list_.size();
}

// add a string to the list
// invoked by only one thread
void add_one(const string& p) {
    {
        boost::upgrade_lock<boost::shared_mutex> lock(mtx);
        boost::upgrade_to_unique_lock<boost::shared_mutex> uniquelock(lock);

        list_.push_back(p);
    }
    cond.notify_one();
}

// get the first string and remove it from the list
// invoked by many threads
string pick_one() {
    string ret;
    {
        boost::upgrade_lock<boost::shared_mutex> lock(mtx);
        boost::upgrade_to_unique_lock<boost::shared_mutex> uniquelock(lock);

        if(!list_.size()) { // if empty, wait for notify
            cond.wait(uniquelock, [&]{ return list_.size() > 0; }); // compile error
        } 
        ret = list_.front();
        list_.pop_front();
    }
    return ret;
}

cond.wait(uniquelock, ...

有编译错误

使用condition_variable进行读/写锁定的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

你不能这样做 - upgrade_to_unique_lock是一个RAII助手,可以在锁的生命周期内获得对锁的独占访问权限。请参阅文档here

  

boost :: upgrade_to_unique_lock允许将boost :: upgrade_lock临时升级为独占所有权。当使用对boost :: upgrade_lock实例的引用构造时,如果该实例对某些Lockable对象具有升级所有权,则该所有权将升级为独占所有权。当boost :: upgrade_to_unique_lock实例被销毁时,Lockable的所有权将降级为升级所有权。

如果您希望shared_mutex使用Boost条件变量,则必须使用here所述的boost::condition_variable_any。两个条件变量之间的差异(尽管参考std而不是Boost)涵盖here