首頁 >後端開發 >C++ >一個執行緒可以從 C 11 原子變數讀取陳舊資料嗎?

一個執行緒可以從 C 11 原子變數讀取陳舊資料嗎?

DDD
DDD原創
2024-12-13 17:53:10304瀏覽

Can One Thread Read Stale Data from a C  11 Atomic Variable?

併發:了解C 11 記憶體模型中的原子性和易失性

考慮由在不同核心上同時運行的多個線程訪問的全域變數。每個線程都可以寫入和讀取變數。一個執行緒可以從原子變數中讀取過時的資訊嗎?

易失性和原子:區別

雖然原子意味著原子訪問,但單獨的易失性並不意味著原子訪問。 Volatile 可用於記憶體映射 I/O 和訊號處理等情況。當與 std::atomic 配對時,它變得多餘。此外,它與原子存取或執行緒間記憶體順序無關。

原子變數的記憶體排序

C 11 中的std::atomic 函式庫提供了一個原子整數型,

 std::atomic<int>;人工智慧; </int>

可見性和排序限制取決於為操作提供的記憶體排序:
  • 序列一致性排序(std::memory_order_seq_cst):為所有操作維護單一總排序所有變數。它不保證過時的值不存在,但它確保獲得的值由操作在排序中的位置決定。
  • 寬鬆排序 (std::memory_order_relaxed):刪除任何排序約束,允許最佳速度,但存在不可預測的執行順序的風險。

讀取-修改-寫入(RMW) 操作:保證新鮮度

RMW 操作,如Exchange()、compare_exchange_strong() 和fetch_add( ),提供了保證:它們始終作用於最新值。在多個執行緒對 ai.fetch_add(1) 的一系列呼叫中,不會傳回重複或缺少的數字。但是,線程可能會在不同的時間點看到這些值。

注意事項與結論

理解原子操作至關重要。建議在生產程式碼中使用它們之前進行徹底的研究和程式碼審查。鎖通常提供一種更易於訪問且幾乎同樣高效的並發方法。

以上是一個執行緒可以從 C 11 原子變數讀取陳舊資料嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn