簡體   English   中英

這個簡單的(原子)鎖定線程是否安全?

[英]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操作應該阻塞,直到獲取成功為止。

關於volatilestd::atomic 的文檔指定(關於=運算符):

原子上為原子變量賦值t。 相當於商店(所需)。

關於store

void store(T desired,memory_order = std :: memory_order_seq_cst);

然后關於memory_order = std::memory_order_seq_cst

  • 在原子存儲之后,編寫器線程中的寫入不能重新排序
  • 在原子加載之前,讀取器線程中的讀取不能重新排序。
  • 在標記為std :: memory_order_seq_cst的所有原子操作之間建立同步。 使用此類原子操作的所有線程都看到相同的內存訪問順序。

所以不,你不需要在這里volatile 另外, volatile保證比上面的保證弱(事實上, volatile在C ++中幾乎沒用):

在執行的一個線程中,對所有易失性對象的訪問(讀取和寫入)保證不會相對於彼此重新排序,但是這個順序不能保證被另一個線程觀察到,因為易失性訪問不會建立線程間同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM