![](/img/trans.png)
[英]How C++ Standard prevents deadlock in spinlock mutex with memory_order_acquire and memory_order_release?
[英]Is memory_order_acquire really sufficient for locking a spinlock?
根據Antony Williams的書“ C ++ Concurrency in Action”,一個spinlock可以實現如下:
class spinlock_mutex {
std::atomic_flag flag;
public:
spinlock_mutex() : flag(ATOMIC_FLAG_INIT) {}
void lock() {
while (flag.test_and_set(std::memory_order_acquire)) ;
}
void unlock() {
flag.clear(std::memory_order_release);
}
};
如果我理解正確, memory_order_acquire
標記可確保使用memory_order_release
標記的最新存儲操作的可見性。 (“釋放操作與獲取操作同步 。”)
由於test_and_set
也是存儲操作,我希望在lock()
方法中需要memory_order_acq_rel
標記,以確保在嘗試鎖定互斥鎖的其他線程中鎖定狀態的可見性。
為什么memory_order_acquire
足夠了?
獲取和釋放不與此原子變量相關,而是與每個線程中讀/寫的其余變量相關。
為了使它更明顯,沒有unlock()
的釋放和lock()
的獲取,標志仍然可見。 問題是在釋放鎖之后可能會推送對由自旋鎖保護的變量的寫入,從而引入競爭條件。 以同樣的方式,鎖內的該變量的讀取可能會被移動到lock()
之前
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.