[英]How to synchronize 2 functions using C++11 thread features?
我們有兩個函數:a()和b()。
有多個線程。 他們中的一些人想要執行a(),其他人想要執行b()。 有以下限制:
如何使用C ++ 11功能進行編碼?
如評論中所指出的 ,這是C ++ 14的std::shared_timed_mutex
指定的讀寫器鎖的典型用例。
因此,如果您的標准庫實現已經支持它,只需使用以下一種方法:
std::shared_timed_mutex mtx;
void a() {
std::unique_lock<std::shared_timed_mutex> lk(mtx);
// ...
}
void b() {
std::shared_lock<std::shared_timed_mutex> lk(mtx);
// ...
}
Boost.Thread的最新版本提供了與編譯器無關的實現。
如果您不能使用其中任何一個,則仍然可以嘗試滾動自己的實現(盡管這樣做的通常的缺點是,如果不小心,可能會引入細微的錯誤)。
基本思想是擁有一個受普通互斥鎖保護的計數器。 每當獲取共享鎖時,計數器就會增加,而在釋放共享鎖時,計數器會減少。 獲取排他鎖會將計數器設置為特殊值,否則該值將無法達到。
僅當計數器為0
時才允許獲取排他鎖(即,當前沒有激活的共享鎖)。 僅當計數器的值不是特殊值時(即,當前未持有排他鎖),才允許獲取共享鎖。 如果嘗試獲取鎖而未滿足相應的前提條件,則可以旋轉或(可能更可取)等待條件變量,直到滿足前提條件。 請注意,在這種情況下,您將需要兩個條件變量,每個前提條件一個。
如果我理解正確,則將需要一個全局鎖來保護函數a,該全局鎖必須同時鎖定在a()和b()內。 它看起來像這樣:
#include <mutex>
#include <thread>
std::mutex a_lock;
void a()
{
std::lock_guard<std::mutex> lock(a_lock);
}
void b()
{
std::lock_guard<std::mutex> lock(a_lock);
}
請注意,使用lock_guard時,函數返回時將自動釋放該鎖。
e:是的,我誤解了你的問題。 稍等一會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.