1. 程式人生 > >C++11的原子操作atomic

C++11的原子操作atomic

atomic類禁用了拷貝建構函式,原因是原子讀和原子寫是2個獨立原子操作,無法保證2個獨立的操作加在一起仍然保證原子性。

這些類中,最簡單的是atomic_flag(其實和atomic<bool>相似),它只有test_and_set()和clear()方法。其中,test_and_set會檢查變數的值是否為false,如果為false則把值改為true。

       除了atomic_flag外,其他型別可以通過atomic<T>獲得。atomic<T>提供了常見且容易理解的方法:

  1. store
  2. load
  3. exchange
  4. compare_exchange_weak
  5. compare_exchange_strong

       store是原子寫操作,而load則是對應的原子讀操作。

       exchange允許2個數值進行交換,並保證整個過程是原子的。

       而compare_exchange_weak和compare_exchange_strong則是著名的CAS(compare and set)。引數會要求在這裡傳入期待的數值和新的數值。它們對比變數的值和期待的值是否一致,如果是,則替換為使用者指定的一個新的數值。如果不是,則將期待的值設為變數的值。

       weak版本的CAS允許偶然出乎意料的返回(比如在欄位值和期待值一樣的時候卻返回了false),不過在一些迴圈演算法中,這是可以接受的。通常它比起strong有更高的效能。