[英]Boost shared_mutex with Conditional Writers
我正在嘗試編寫一個類,該類允許多個讀取器或僅一個寫入器訪問數據。 問題是讀者可以有條件地成為作者,並且我想確保無論要成為作家的線程有多少,都只允許一個線程成為作者,而其他線程等待作者完成並改回讀者。
問題出在if(condition)
語句上,因為可以由多個線程將其評估為true,即使數據僅需寫入一次,它們也都試圖成為寫程序。
class Test {
public:
int getData() {
boost::shared_lock<boost::shared_mutex> lock(access_);
if(condition) {
writeData();
}
// Do stuff
}
void writeData() {
// Get exclusive access
boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(access_);
// Do stuff
}
private:
boost::shared_mutex access_;
}
所以我以可接受的方式進行了這項工作。 基本上,如果需要寫入,則釋放共享鎖,然后寫入功能將獲得唯一的鎖。 在寫函數中獲得唯一鎖后,它會再次檢查以確保仍然需要寫操作來處理多個線程認為它們需要寫數據的情況。
我知道這是不理想的,因為在只有一個線程需要唯一鎖的情況下,等待多個線程中唯一鎖所花費的時間。 但是,目前的性能已經足夠好,並且比以前有了很大的改進。
class Test {
public:
int getData() {
boost::shared_lock<boost::shared_mutex> lock(access_);
if(need_write) {
lock.unlock();
writeData();
lock.lock();
}
// Do stuff
}
void writeData() {
// Get exclusive access
boost::unique_lock<boost::shared_mutex> unique_lock(access_);
if(need_write) {
return;
}
// Do stuff
}
private:
boost::shared_mutex access_;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.