簡體   English   中英

跨線程讀取無符號整數時,c++ 位是否自動切換?

[英]Are c++ bits switched atomically when reading unsigned ints across a thread?

在 mac、pc 和 unix 上的 C++ 中:如果我在一個線程(寫入線程)上寫入無符號整數或 Ipp32us 並從另一個線程(讀取線程)讀取無符號整數,讀取線程是否讀取沒有故障,即使寫線程正在寫。 我想知道這些位是否以原子方式切換。 謝謝

按照標准,對於非原子類型,沒有任何保證。 在實踐中,它通常取決於底層硬件和相關數據類型的對齊方式; 例如,如果 64 位寫入作為一對 32 位寫入在硬件上實現,那么您會看到損壞的值(舊值的一半,新值的一半)。 如果硬件將它們實現為真正的 64 位寫入,則您可能是安全的,但這不是值得信賴的。

請記住,“寫入”可能會在多個階段被破壞,例如,編譯器實際上可能會為每一半生成單獨的內存移動指令(因此即使在單個內核上,也可以在寫入的一半之間安排另一個線程),或者它可能將它寫為一條指令,但處理器在內部將它實現為一對寫入(以任一順序,甚至程序集也不告訴您順序;像 x86 這樣的體系結構似乎執行 CISC 指令,但實際上將它們轉換為完全不同的內部 RISC 指令集),或者處理器可能將其實現為單次寫入,但如果存儲跨越高速緩存行並且系統具有弱內存排序,則它很容易僅刷新其中一行(不可預測)其他處理器請求它的時間,等等。

重點是,如果你想要原子寫入和讀取,實際上使用C++11 std::atomic types 沒有它,即使它可以工作,也只是意味着它可以在那個編譯器上和那個硬件上工作,並且根本沒有提到可移植性。

暫無
暫無

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

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