C++11 並發指南六( <atomic> 類型詳解二 std::atomic ) 介紹了基本的原子類型 std::atomic 的用法,本節我會給大家介紹C++11 標准庫中的 std::atomic 針對整形(integral)和指針類型的特化版本做了哪些改進。
總地來說,C++11 標准庫中的 std::atomic 針對整形(integral)和指針類型的特化版本新增了一些算術運算和邏輯運算操作。具體如下:
integral fetch_add(integral, memory_order = memory_order_seq_cst) volatile;
integral fetch_add(integral, memory_order = memory_order_seq_cst);
integral fetch_sub(integral, memory_order = memory_order_seq_cst) volatile;
integral fetch_sub(integral, memory_order = memory_order_seq_cst);
integral fetch_and(integral, memory_order = memory_order_seq_cst) volatile;
integral fetch_and(integral, memory_order = memory_order_seq_cst);
integral fetch_or(integral, memory_order = memory_order_seq_cst) volatile;
integral fetch_or(integral, memory_order = memory_order_seq_cst);
integral fetch_xor(integral, memory_order = memory_order_seq_cst) volatile;
integral fetch_xor(integral, memory_order = memory_order_seq_cst);
integral operator++(int) volatile;
integral operator++(int);
integral operator--(int) volatile;
integral operator--(int);
integral operator++() volatile;
integral operator++();
integral operator--() volatile;
integral operator--();
integral operator+=(integral) volatile;
integral operator+=(integral);
integral operator-=(integral) volatile;
integral operator-=(integral);
integral operator&=(integral) volatile;
integral operator&=(integral);
integral operator|=(integral) volatile;
integral operator|=(integral);
integral operator^=(integral) volatile;
integral operator^=(integral);
下面我們來簡單介紹以上的 std::atomic 特化版本的成員函數。
-
fetch_add
if T is integral (1) |
T fetch_add (T val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_add (T val, memory_order sync = memory_order_seq_cst) noexcept;
|
if T is pointer (2) |
T fetch_add (ptrdiff_t val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_add (ptrdiff_t val, memory_order sync = memory_order_seq_cst) noexcept;
|
-
將原子對象的封裝值加 val,並返回原子對象的舊值(適用於整形和指針類型的 std::atomic 特化版本),整個過程是原子的。sync 參數指定內存序:
Memory Order 值 |
Memory Order 類型 |
memory_order_relaxed |
Relaxed |
memory_order_consume |
Consume |
memory_order_acquire |
Acquire |
memory_order_release |
Release |
memory_order_acq_rel |
Acquire/Release |
memory_order_seq_cst |
Sequentially consistent |
-
另外,如果第二個參數不指定(取默認參數 memory_order_seq_cst),則 fetch_add 相當與 std::atomic::operator+=。
-
fetch_sub
if T is integral (1) |
T fetch_sub (T val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_sub (T val, memory_order sync = memory_order_seq_cst) noexcept;
|
if T is pointer (2) |
T fetch_sub (ptrdiff_t val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_sub (ptrdiff_t val, memory_order sync = memory_order_seq_cst) noexcept;
|
-
將原子對象的封裝值減 val,並返回原子對象的舊值(適用於整形和指針類型的 std::atomic 特化版本),整個過程是原子的。sync 參數指定內存序:
Memory Order 值 |
Memory Order 類型 |
memory_order_relaxed |
Relaxed |
memory_order_consume |
Consume |
memory_order_acquire |
Acquire |
memory_order_release |
Release |
memory_order_acq_rel |
Acquire/Release |
memory_order_seq_cst |
Sequentially consistent |
-
另外,如果第二個參數不指定(取默認參數 memory_order_seq_cst),則 fetch_sub 相當與 std::atomic::operator-=。
-
fetch_and
T fetch_and (T val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_and (T val, memory_order sync = memory_order_seq_cst) noexcept;
-
將原子對象的封裝值按位與 val,並返回原子對象的舊值(只適用於整型的 std::atomic 特化版本),整個過程是原子的。sync 參數指定內存序:
Memory Order 值 |
Memory Order 類型 |
memory_order_relaxed |
Relaxed |
memory_order_consume |
Consume |
memory_order_acquire |
Acquire |
memory_order_release |
Release |
memory_order_acq_rel |
Acquire/Release |
memory_order_seq_cst |
Sequentially consistent |
-
另外,如果第二個參數不指定(取默認參數 memory_order_seq_cst),則 fetch_add 相當與 std::atomic::operator&=。
-
fetch_or
T fetch_or (T val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_or (T val, memory_order sync = memory_order_seq_cst) noexcept;
-
將原子對象的封裝值按位或 val,並返回原子對象的舊值(只適用於整型的 std::atomic 特化版本),整個過程是原子的。sync 參數指定內存序:
Memory Order 值 |
Memory Order 類型 |
memory_order_relaxed |
Relaxed |
memory_order_consume |
Consume |
memory_order_acquire |
Acquire |
memory_order_release |
Release |
memory_order_acq_rel |
Acquire/Release |
memory_order_seq_cst |
Sequentially consistent |
-
另外,如果第二個參數不指定(取默認參數 memory_order_seq_cst),則 fetch_or 相當與 std::atomic::operator|=。
-
fetch_xor
T fetch_xor (T val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_xor (T val, memory_order sync = memory_order_seq_cst) noexcept;
-
將原子對象的封裝值按位異或 val,並返回原子對象的舊值(只適用於整型的 std::atomic 特化版本),整個過程是原子的。sync 參數指定內存序:
Memory Order 值 |
Memory Order 類型 |
memory_order_relaxed |
Relaxed |
memory_order_consume |
Consume |
memory_order_acquire |
Acquire |
memory_order_release |
Release |
memory_order_acq_rel |
Acquire/Release |
memory_order_seq_cst |
Sequentially consistent |
-
另外,如果第二個參數不指定(取默認參數 memory_order_seq_cst),則 fetch_xor 相當與 std::atomic::operator^=。
-
operator++
pre-increment (1) |
T operator++() volatile noexcept;
T operator++() noexcept;
|
post-increment (2) |
T operator++ (int) volatile noexcept;
T operator++ (int) noexcept;
|
-
自增運算符重載, 第一種形式 (1) 返回自增后的值(即前綴++),第二種形式(2) 返回自增前的值(即后綴++),適用於整形和指針類型的 std::atomic 特化版本。
-
operator--
-
自減運算符重載, 第一種形式 (1) 返回自減后的值(即前綴--),第二種形式(2) 返回自減前的值(即后綴--),適用於整形和指針類型的 std::atomic 特化版本。
-
atomic::operator (comp. assign.)
-
復合賦值運算符重載,主要包含以下形式:
if T is integral (1) |
T operator+= (T val) volatile noexcept;
T operator+= (T val) noexcept;
T operator-= (T val) volatile noexcept;
T operator-= (T val) noexcept;
T operator&= (T val) volatile noexcept;
T operator&= (T val) noexcept;
T operator|= (T val) volatile noexcept;
T operator|= (T val) noexcept;
T operator^= (T val) volatile noexcept;
T operator^= (T val) noexcept;
|
if T is pointer (2) |
T operator+= (ptrdiff_t val) volatile noexcept;
T operator+= (ptrdiff_t val) noexcept;
T operator-= (ptrdiff_t val) volatile noexcept;
T operator-= (ptrdiff_t val) noexcept;
|
以上各個 operator 都會有對應的 fetch_* 操作,詳細見下表:
操作符 |
成員函數 |
支持類型 |
復合賦值 |
等價於 |
整型 |
指針類型 |
其他類型 |
+ |
atomic::operator+= |
atomic::fetch_add |
是 |
是 |
否 |
- |
atomic::operator-= |
atomic::fetch_sub |
是 |
是 |
否 |
& |
atomic::operator&= |
atomic::fetch_and |
是 |
否 |
否 |
| |
atomic::operator|= |
atomic::fetch_or |
是 |
否 |
否 |
^ |
atomic::operator^= |
atomic::fetch_xor |
是 |
否 |
否 |
好了,本節先介紹這里,下一節我會介紹 C++11 中 C 風格的原子操作 API。