簡體   English   中英

memory_order_acquire真的足以鎖定自旋鎖嗎?

[英]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.

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