2013-04-08 50 views
3

std::atomic_flag有2個功能,使用這些默認std::memory_order S:爲什麼atomic_flag.clear()具有次優的默認memory_order參數?

void clear(std::memory_order order = std::memory_order_seq_cst); 
bool test_and_set(std::memory_order order = std::memory_order_seq_cst); 

也許我錯了,但不應該clear總是memory_order_releasetest_and_set總是memory_order_acquire?也許我誤解了這些。

+0

你誤解了'memory_order_release'和'memory_order_acquire'的含義。它們關於記憶順序,而不是鎖定。 (儘管定義內存順序對_implementing_ locks很重要。)請參見http://en.cppreference.com/w/cpp/atomic/memory_order。 'clear()'可以是'memory_order_release',但'test_and_set'''''''不會是'memory_order_acquire',因爲它是一個讀 - 修改 - 寫它必須是'memory_order_acq_release'。有幾種架構可以通過使用'memory_order_seq_cst'之外的其他東西來獲得小的性能提升,但通常不值得。 – 2013-04-09 13:00:40

回答

4

對於C++ 11中的所有原子操作,默認內存順序是順序一致性(std::memory_order_seq_cst)。如果你願意,你可以指定一個更輕鬆的記憶順序,雖然這往往更復雜的理由。

std::atomic_flag已被保證無鎖且可用於構建其他同步方法。而如果編譯器/庫編寫器如此選擇並且仍然符合規範,則std::atomic<T>類型可以用鎖實現。所以這就是爲什麼std::atomic_flag存在這些默認值。根據您正在嘗試執行的操作,指定不同的內存順序可能有意義,但默認設置爲保守正確,順序一致。

相關問題