2016-05-23 72 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