我不知道爲什麼我不能做到這一點在C++ 14(或17)條件變量和共享互斥
std::shared_timed_mutex mutex;
std::unique_lock<std::shared_timed_mutex> lock(mutex);
std::condition_variable var;
while(!some_condition)
var.wait(lock);
條件變量似乎只是用的std ::互斥工作。但爲什麼?
我不知道爲什麼我不能做到這一點在C++ 14(或17)條件變量和共享互斥
std::shared_timed_mutex mutex;
std::unique_lock<std::shared_timed_mutex> lock(mutex);
std::condition_variable var;
while(!some_condition)
var.wait(lock);
條件變量似乎只是用的std ::互斥工作。但爲什麼?
這是由標準定義的,以便實現最大的效率。如果您想要使用與condition_variable
不同的鎖,則需要使用condition_variable_any
。請注意,雖然condition_variable_any
實現有一些開銷。從標準
引用:30.5條件變量
condition_variable
類提供了條件變量只能unique_lock<mutex>
類型的對象,從而允許在某些平臺上最大 追求效率上的等待。
非常感謝你!我不知道這存在! –
@ T.C。謝謝,只是試圖找出如何使這項工作:) – inf
你能分享你的用例嗎? – inf
這很酷,你不僅可以等待上面顯示的「寫入鎖定」的'shared_timed_mutex',還可以等待它通過使用'shared_lock'來「讀取鎖定」。也許你需要等到作家線程更新信息才能發佈它。 –
用例有點複雜:我有一個全局(現在)讀/寫鎖的數據存儲。並且還鎖定每個對象。 如果我獲得一個對象,我首先鎖定全局鎖,檢索該對象,鎖定該對象,然後釋放全局鎖。 現在可能會出現對象被刪除的情況。所以我不想等待對象鎖(因爲這個鎖也會被銷燬),而是有一個條件變量,當某些事情發生變化時喚醒線程。 也許不是最好的設計,但它沒有死鎖,並且不佔用太多內存。 –