2016-01-21 120 views
6

我不知道爲什麼我不能做到這一點在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 ::互斥工作。但爲什麼?

+0

你能分享你的用例嗎? – inf

+0

這很酷,你不僅可以等待上面顯示的「寫入鎖定」的'shared_timed_mutex',還可以等待它通過使用'shared_lock'來「讀取鎖定」。也許你需要等到作家線程更新信息才能發佈它。 –

+0

用例有點複雜:我有一個全局(現在)讀/寫鎖的數據存儲。並且還鎖定每個對象。 如果我獲得一個對象,我首先鎖定全局鎖,檢索該對象,鎖定該對象,然後釋放全局鎖。 現在可能會出現對象被刪除的情況。所以我不想等待對象鎖(因爲這個鎖也會被銷燬),而是有一個條件變量,當某些事情發生變化時喚醒線程。 也許不是最好的設計,但它沒有死鎖,並且不佔用太多內存。 –

回答

9

這是由標準定義的,以便實現最大的效率。如果您想要使用與condition_variable不同的鎖,則需要使用condition_variable_any。請注意,雖然condition_variable_any實現有一些開銷。從標準

引用:30.5條件變量

condition_variable類提供了條件變量只能 unique_lock<mutex>類型的對象,從而允許在某些平臺上最大 追求效率上的等待。

+0

非常感謝你!我不知道這存在! –

+0

@ T.C。謝謝,只是試圖找出如何使這項工作:) – inf