簡體   English   中英

c++,std::atomic,std::memory_order 是什么以及如何使用它們?

[英]c++, std::atomic, what is std::memory_order and how to use them?

誰能用簡單的英語解釋什么是std::memory_order ,以及如何將它們與std::atomic<>

我在這里找到了參考資料和幾個例子,但根本不明白。 http://en.cppreference.com/w/cpp/atomic/memory_order

std::memory_order值允許您對原子操作提供的內存排序指定細粒度約束。 如果您正在從多個線程修改和訪問原子變量,那么將std::memory_order值傳遞給您的操作允許您放寬對編譯器和處理器的約束,關於這些原子變量上的操作對其他線程可見的順序,以及這些操作對應用程序中的非原子數據產生的同步影響。

std::memory_order_seq_cst的默認排序是最受約束的,並提供您可能期望的“直觀”屬性:如果線程 A 存儲一些數據,然后使用std::memory_order_seq_cst設置原子標志,則如果線程 B 看到標志是set 那么它可以看到線程 A 寫入的數據。其他內存排序值不一定提供這種保證,因此必須非常小心地使用。

基本前提是:不要使用std::memory_order_seq_cst (默認值)以外的任何東西,除非 (a) 你真的知道你在做什么,並且可以證明在所有情況下寬松的使用都是安全的,並且 (b) 你的profiler 表明您打算使用寬松排序的數據結構和操作是一個瓶頸。

我的書C++ Concurrency in Action用一整章(45 頁)來詳細介紹 C++ 內存模型、原子操作和std::memory_order約束,另外一章(44 頁)用原子操作進行鎖同步-free 數據結構,以及放寬排序約束的后果。

我關於Dekker 算法Peterson互斥算法的博客條目展示了一些問題。

誰能用簡單的英語解釋什么是 std::memory_order ,

我為各種內存排序找到的最好的“簡單英語”解釋是 Bartoz Milewski 的關於輕松原子的文章: http ://bartoszmilewski.com/2008/12/01/c-atomics-and-memory-ordering/

以及后續帖子: http : //bartoszmilewski.com/2008/12/23/the-inscrutable-c-memory-model/

但請注意,雖然這些文章是一個很好的介紹,但它們早於 C++11 標准,並且不會告訴您安全使用它們需要知道的一切。

以及如何將它們與 std::atomic<> 一起使用?

我在這里給你的最好建議是:不要 松弛原子(可能)是 C++11 中最棘手和最危險的事情。 堅持使用默認內存排序(順序一致性)的std::atomic<T> ,直到你真的非常確定你有一個可以通過使用寬松內存排序來解決的性能問題。

在上面鏈接的第二篇文章中,Bartoz Milewski 得出以下結論:

在嘗試推理 C++ 弱原子時,我不知道自己在做什么。 它們背后的理論非常復雜,以至於幾乎無法使用。 花了三個人(安東尼、漢斯和我)和對標准的修改來完成一個相對簡單的算法的證明。 想象一下對基於弱原子的無鎖隊列做同樣的事情!

不。一個“簡單的英語”解釋需要 32 頁,可以在這里找到。

如果您不想閱讀它,您可以忘記內存排序,因為您鏈接到的頁面說默認是順序一致的排序,這是“始終做理智的事情”設置。

要使用任何其他設置,您確實必須閱讀並理解上述論文及其中的示例。

簡而言之,您的編譯器和 CPU 執行指令的順序可能與您編寫指令的順序不同。 對於單線程,這不是問題,因為它看起來是正確的。 對於多個處理器上的多個線程,這成為一個問題。 C++ 中的內存排序限制了您的編譯器/CPU 可以執行的操作並修復此類問題。

例如,如果您查看我關於雙重檢查鎖定的文章,您會看到排序如何與該模式混淆——它提到可以使用顯示原子內存排序來修復它。

關於重新排序本身,您也可以考慮CPU 重新排序——同樣,編譯器也可能會進行重新排序。

請注意,有關此主題的任何文件(包括我的)都提供了理論方案。 最常見的 CPU,如 x86,具有非常強的排序保證,因此根本不需要大量的顯式排序。 因此,即使您不使用正確的 C++11 原子,您的代碼也可能仍然有效。

正如 zvrba 提到的,該主題實際上非常詳細。 關於內存屏障的 linux 內核文檔也包含很多詳細信息。

GCC wiki 中有一些簡單的英語。 ;)

http://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync

暫無
暫無

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

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