[英]Is std::mutex as a member variable thread-safe for multiple threads?
std :: mutex作為成員變量對多個線程是線程安全的嗎?
有一個類的實例,該實例具有變量和互斥體作為成員。
每個函數在不同的線程中調用。
我很好奇可以使用這樣的互斥鎖嗎?
有很多示例代碼使用一種針對互斥量的包裝類,例如Guard或類似的東西。
我更喜歡簡單地使用它,並希望顯式解鎖。 沒有破壞時間。
#include <mutex>
#include <stdio.h>
class A {
private:
bool _is;
std::mutex _mutex;
}
// this function runs in Thread A
void A::read() {
_mutex.lock();
printf("%d", _is);
_mutex.unlock();
}
// this function runs in Thread B
void A::write() {
_mutex.lock();
printf("%d", _is);
_is = !_is;
_mutex.unlock();
}
它基本上可以正常工作,但是您需要注意幾個“陷阱”:
如果在lock()
和unlock()
調用之間的代碼拋出異常(或使用return
或goto
關鍵字),則可能永遠不會到達unlock()
調用,因此您的互斥鎖將無限期保持鎖定狀態。 這可能會導致應用程序死鎖,因為每個隨后嘗試鎖定互斥鎖的線程最終都將永遠等待自己的lock()
調用返回。 (如果改為使用lock_guard / RAII方法,則此危險消失了,這就是為什么這樣做是推薦的/更安全的方法)
如果A
對象在仍可被其他線程訪問的同時被刪除,則可能會導致不確定的行為,因為線程所依賴的member-variable-mutex序列化將被銷毀。 (避免這種情況的典型方法是,在銷毀它們所依賴的互斥對象之前 ,確保所有線程都已經被join()
'了-或通過將互斥對象移出對象並移入可以保證的更高級別的對象中在線程仍在運行時不會被破壞)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.