2016-05-23 34 views
0

我使用std :: list来保存一些字符串,一个线程写入列表和一些其他线程读取它(获取第一个和从列表中删除)。下面的代码:如何使boost_to_unique_lock + condition_variable提升一起工作?

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的正确方法编译错误?

回答

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::condition_variable_any描述here升压条件变量。两个条件变量(尽管参考std,而不是Boost)之间的差异涵盖here

+0

似乎'condition_variable_any'应该可以工作,但是如何在没有'upgrade_to_unique_lock'的情况下创建写锁? – aj3423