如何让助推upgrade_to_unique_lock+condition_variable协同工作



我使用 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一起使用的正确方法是什么?

您不能这样做 - upgrade_to_unique_lock 是一个 RAII 助手,用于在其生命周期内获得锁的独占访问权限。 请参阅此处的文档。

boost::upgrade_to_unique_lock 允许将 boost::upgrade_lock 临时升级到独占所有权。当使用对 boost::upgrade_lock 实例的引用进行构造时,如果该实例对某个可锁定对象具有升级所有权,则该所有权将升级为独占所有权。当 boost::upgrade_to_unique_lock 实例被销毁时,可锁定对象的所有权将降级回以升级所有权。

如果您希望将shared_mutex与 Boost 条件变量一起使用,则必须按照此处所述使用boost::condition_variable_any。这里讨论了两个条件变量之间的区别(尽管参考的是std,而不是Boost)。

相关内容

  • 没有找到相关文章

最新更新