[英]Is this simple (atomic) lock thread safe?
這段代碼是否安全? 我應該在函數sig中有volatile嗎? (例如: void Unlock() volatile {v=0;}
)如果不是我如何使這個線程安全?
class SimpleLock {
std::atomic<int> v;
public:
bool try_lock() { int z=0; return v.compare_exchange_strong(z, 1); }
void lock() { while(try_lock()==false) std::this_thread::yield(); }
void unlock() {v=0;}
};
是的,它是線程安全的,雖然你可以將Lock
重命名為TryLock
因為你沒有在循環中調用CAS直到它成功。 傳統上, Lock
操作應該阻塞,直到獲取成功為止。
關於volatile
, std::atomic
的文檔指定(關於=
運算符):
原子上為原子變量賦值t。 相當於商店(所需)。
關於store
:
void store(T desired,memory_order = std :: memory_order_seq_cst);
然后關於memory_order = std::memory_order_seq_cst
:
所以不,你不需要在這里volatile
。 另外, volatile
保證比上面的保證弱(事實上, volatile
在C ++中幾乎沒用):
在執行的一個線程中,對所有易失性對象的訪問(讀取和寫入)保證不會相對於彼此重新排序,但是這個順序不能保證被另一個線程觀察到,因為易失性訪問不會建立線程間同步。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.