原子能

作為 C 語言的一部分,Atomics 是自 C11 以來可用的可選功能。

它們的目的是確保在不同執行緒之間共享變數的無競爭訪問。如果沒有原子限定,如果兩個執行緒同時訪問它,則共享變數的狀態將是未定義的。例如,遞增操作(++)可以分成幾個彙編指令,一個讀取,一個加法本身和一個儲存指令。如果另一個執行緒將執行相同的操作,則它們的兩個指令序列可能交織在一起並導致不一致的結果。

  • 型別: 除了陣列型別之外的所有物件型別都可以使用 _Atomic 進行限定。

  • 運算子: 所有讀取 - 修改 - 寫入運算子(例如++*=)都保證是原子的。

  • 操作: 還有一些其他操作被指定為型別泛型函式,例如 atomic_compare_exchange

  • 執行緒: 當它們被不同的執行緒訪問時,保證不會訪問它們。

  • 訊號處理程式:如果原子型別上的所有操作都是無狀態的,則稱為無鎖定。在這種情況下,它們還可用於處理正常控制流和訊號處理程式之間的狀態變化。

  • 只有一種資料型別可以保證無鎖:atomic_flag。這是一種最小型別,其操作旨在對映到有效的測試和設定硬體指令。

在 C11 的執行緒介面中可以使用其他避免競爭條件的方法,特別是互斥型別 mtx_t,以相互排除執行緒訪問關鍵資料或關鍵程式碼段。如果沒有原子,必須使用這些來防止匹配。