c++ 11 原子操作库 (std::atomic)(三)
atomic 類(lèi)模板及其針對(duì)布爾、整型和指針類(lèi)型的特化
每個(gè) std::atomic 模板的實(shí)例化和全特化定義一個(gè)原子類(lèi)型。若一個(gè)線程寫(xiě)入原子對(duì)象,同時(shí)另一線程從它讀取,則行為良好定義(數(shù)據(jù)競(jìng)爭(zhēng)的細(xì)節(jié)見(jiàn)內(nèi)存模型)。
另外,對(duì)原子對(duì)象的訪問(wèn)可以建立線程間同步,并按 std::memory_order 所對(duì)非原子內(nèi)存訪問(wèn)定序。
std::atomic 既不可復(fù)制亦不可移動(dòng)。
令原子值增加或減少一
std::atomic<T>::operator++,++(int),--,--(int)| T operator++() noexcept; | (1) | (僅為 atomic<Integral> 模板特化的成員) (C++11 起) |
| T* operator++() noexcept; | (1) | (僅為 atomic<T*> 模板特化的成員) (C++11 起) |
| T operator++( int ) noexcept; | (2) | (僅為 atomic<Integral> 模板特化的成員) (C++11 起) |
| T* operator++( int ) noexcept; | (2) | (僅為 atomic<T*> 模板特化的成員) (C++11 起) |
| T operator--() noexcept; | (3) | (僅為 atomic<Integral> 模板特化的成員) (C++11 起) |
| T* operator--() noexcept; | (3) | (僅為 atomic<T*> 模板特化的成員) (C++11 起) |
| T operator--( int ) noexcept; | (4) | (僅為 atomic<Integral> 模板特化的成員) (C++11 起) |
| T* operator--( int ) noexcept; | (4) | (僅為 atomic<T*> 模板特化的成員) (C++11 起) |
原子地自增或自減當(dāng)前值。操作為讀-修改-寫(xiě)操作。
1) 進(jìn)行原子前自增。等價(jià)于 fetch_add(1)+1 。
2) 進(jìn)行原子后自增。等價(jià)于 fetch_add(1) 。
3) 進(jìn)行原子前自減。等價(jià)于 fetch_sub(1)-1 。
4) 進(jìn)行原子后自減。等價(jià)于 fetch_sub(1) 。
對(duì)于有符號(hào)整數(shù) (Integral) 類(lèi)型,算術(shù)定義為使用補(bǔ)碼表示。無(wú)未定義結(jié)果。對(duì)于 T* 類(lèi)型,結(jié)果可能為未定義地址,但這些操作不會(huì)另有未定義行為。
參數(shù)
(無(wú))
返回值
1,3) 修改后的原子變量的值。正式地說(shuō), *this 的修改順序中自增/自減值的結(jié)果立即前趨于此函數(shù)的效果。
2,4) 修改前的原子變量的值。正式地說(shuō), *this 的修改順序中值立即前趨于此函數(shù)的效果。
注意
不同于大多數(shù)前自增和自減運(yùn)算符,原子類(lèi)型的前自增和自減運(yùn)算符不返回被修改對(duì)象的引用。它們替而返回存儲(chǔ)值的副本。
?
加、減,或與原子值進(jìn)行逐位與、或、異或
std::atomic<T>::operator+=,-=,&=,|=,^=僅為 atomic<Integral>(C++11) 與 atomic<Floating>(C++20) 模板特化的成員
| T operator+=( T arg ) noexcept; | ||
| T operator+=( T arg ) volatile noexcept; |
僅為 atomic<T*> 模板特化的成員
| T* operator+=( std::ptrdiff_t arg ) noexcept; | ||
| T* operator+=( std::ptrdiff_t arg ) volatile noexcept; |
僅為 atomic<Integral>(C++11) 與 atomic<Floating>(C++20) 模板特化的成員
| T operator-=( T arg ) noexcept; | ||
| T operator-=( T arg ) volatile noexcept; |
僅為 atomic<T*> 模板特化的成員
| T* operator-=( std::ptrdiff_t arg ) noexcept; | ||
| T* operator-=( std::ptrdiff_t arg ) volatile noexcept; |
僅為 atomic<Integral> 模板特化的成員
| T operator&=( T arg ) noexcept; | ||
| T operator&=( T arg ) volatile noexcept; | ||
| T operator|=( T arg ) noexcept; | ||
| T operator|=( T arg ) volatile noexcept; | ||
| T operator^=( T arg ) noexcept; | ||
| T operator^=( T arg ) volatile noexcept; |
?
原子地以涉及先前值和 arg 的計(jì)算結(jié)果替換當(dāng)前值。操作是讀-修改-寫(xiě)操作。
1) 進(jìn)行原子加法。等價(jià)于 fetch_add(arg) + arg 。
2) 進(jìn)行原子減法。等價(jià)于 fetch_sub(arg) - arg 。
3) 進(jìn)行原子逐位與。等價(jià)于 fetch_and(arg) & arg 。
4) 進(jìn)行原子逐位或。等價(jià)于 fetch_or(arg) | arg 。
5) 進(jìn)行原子逐位異或。等價(jià)于 fetch_xor(arg) ^ arg 。
對(duì)于有符號(hào)整數(shù) (Integral) 類(lèi)型,算術(shù)定義為使用補(bǔ)碼表示。無(wú)未定義結(jié)果。
| 對(duì)于浮點(diǎn)類(lèi)型,有影響的浮點(diǎn)環(huán)境可能異于調(diào)用方線程的浮點(diǎn)環(huán)境。操作不必服從對(duì)應(yīng)的 std::numeric_limits 特性,但鼓勵(lì)這么做。若結(jié)果不是其類(lèi)型所能表示的值,則結(jié)果未指定,但操作不會(huì)另有未定義行為。 | (C++20 起) |
對(duì)于 T* 類(lèi)型,結(jié)果可能為未定義地址,但操作不會(huì)另有未定義行為。若 T 不是對(duì)象類(lèi)型則程序?yàn)椴∈健?/p>
參數(shù)
| arg | - | 算術(shù)運(yùn)算的參數(shù) |
返回值
返回值(即應(yīng)用對(duì)應(yīng)二元運(yùn)算符到 *this 的修改順序中立即前趨于成員對(duì)應(yīng)函數(shù)效果的值)
注意
不同于大多數(shù)復(fù)合賦值運(yùn)算符,原子類(lèi)型的復(fù)合賦值運(yùn)算符不返回到其左側(cè)運(yùn)算數(shù)的引用。它們替而返回存儲(chǔ)的值的副本。
原子地將參數(shù)加到存儲(chǔ)于原子對(duì)象的值,并返回先前保有的值
std::atomic<T>::fetch_add?僅為 atomic<Integral>(C++11) 與 atomic<Floating>(C++20) 模板特化的成員
| T fetch_add( T arg, | ||
| T fetch_add( T arg, |
僅為 atomic<T*> 模板特化的成員
| T* fetch_add( std::ptrdiff_t arg, | ||
| T* fetch_add( std::ptrdiff_t arg, |
原子地以值和 arg 的算術(shù)加法結(jié)果替換當(dāng)前值。運(yùn)算是讀修改寫(xiě)操作。按照 order 的值影響內(nèi)存。
對(duì)于有符號(hào) Integral 類(lèi)型,定義算術(shù)為使用補(bǔ)碼。無(wú)未定義結(jié)果。
| 對(duì)于浮點(diǎn)類(lèi)型,有影響的浮點(diǎn)環(huán)境可能異于調(diào)用方線程的浮點(diǎn)環(huán)境。操作不必服從對(duì)應(yīng)的 std::numeric_limits 特性,但鼓勵(lì)這么做。若結(jié)果不是其類(lèi)型所能表示的值,則結(jié)果未指定,但其他情況下操作無(wú)未定義行為。 | (C++20 起) |
對(duì)于 T* 類(lèi)型,結(jié)果可能為未定義的地址,但其他情況下運(yùn)算無(wú)未定義行為。
參數(shù)
| arg | - | 算術(shù)加法的另一參數(shù) |
| order | - | 強(qiáng)制的內(nèi)存順序制約 |
返回值
*this 的修改順序中,立即前趨此函數(shù)效應(yīng)的值。
調(diào)用示例
#include <iostream> #include <thread> #include <atomic>std::atomic<long long> data; void do_work() {data.fetch_add(1, std::memory_order_relaxed); }int main() {std::thread th1(do_work);std::thread th2(do_work);std::thread th3(do_work);std::thread th4(do_work);std::thread th5(do_work);th1.join();th2.join();th3.join();th4.join();th5.join();std::cout << "Result:" << data << '\n'; }?
原子地從存儲(chǔ)于原子對(duì)象的值減去參數(shù),并獲得先前保有的值
std::atomic<T>::fetch_sub| 僅為 atomic<Integral>(C++11) 與 atomic<Floating>(C++20) 模板特化的成員 | ||||
| T fetch_sub( T arg, | (1) | (2) | ||
| T fetch_sub( T arg, | ||||
| 僅為 atomic<T*> 模板特化的成員 | ||||
| T* fetch_sub( std::ptrdiff_t arg, | ||||
| T* fetch_sub( std::ptrdiff_t arg, |
以值和 arg 的算術(shù)減法結(jié)果原子地替換當(dāng)前值。操作是讀修改寫(xiě)操作。按照 order 的值影響內(nèi)存。
對(duì)于有符號(hào) Integral 類(lèi)型,定義算術(shù)為使用補(bǔ)碼表示。無(wú)未定義結(jié)果。
| 對(duì)于浮點(diǎn)類(lèi)型,有影響的浮點(diǎn)環(huán)境可能異于調(diào)用方線程的浮點(diǎn)環(huán)境。操作不必服從對(duì)應(yīng)的 std::numeric_limits 特性,但鼓勵(lì)這么做。若結(jié)果不是其類(lèi)型所能表示的值,則結(jié)果未指定,但操作不會(huì)另有未定義行為。 | (C++20 起) |
對(duì)于 T* 類(lèi)型,結(jié)果可能是未定義地址,但操作不會(huì)另有未定義行為。若 T 不是對(duì)象類(lèi)型則程序?yàn)椴∈健?/p>
參數(shù)
| arg | - | 算術(shù)減法的另一參數(shù) |
| order | - | 強(qiáng)制的內(nèi)存順序制約 |
返回值
*this 的修改順序中立即前趨此函數(shù)效果的值。
原子地進(jìn)行參數(shù)和原子對(duì)象的值的逐位與,并獲得先前保有的值
std::atomic<T>::fetch_and| T fetch_and( T arg, | ||
| T fetch_and( T arg, |
原子地以值和 arg 逐位與的結(jié)果替換當(dāng)前值。運(yùn)算是讀修改寫(xiě)操作。按照 order 的值影響內(nèi)存。
參數(shù)
| arg | - | 逐位與的另一參數(shù) |
| order | - | 強(qiáng)制的內(nèi)存順序制約 |
返回值
*this 的修改順序中立即前趨此函數(shù)效果的值。
原子地進(jìn)行參數(shù)和原子對(duì)象的值的逐位或,并獲得先前保有的值
std::atomic<T>::fetch_or| T fetch_or( T arg, | ||
| T fetch_or( T arg, |
原子地以值和 arg 逐位或的結(jié)果替換當(dāng)前值。運(yùn)算為讀修改寫(xiě)操作。按照 order 的值影響內(nèi)存。
參數(shù)
| arg | - | 逐位或的另一參數(shù) |
| order | - | 強(qiáng)制的內(nèi)存順序制約 |
返回值
*this 的修改順序中立即前趨此函數(shù)效果的值。
原子地進(jìn)行參數(shù)和原子對(duì)象的值的逐位異或,并獲得先前保有的值
std::atomic<T>::fetch_xor| T fetch_xor( T arg, | ||
| T fetch_xor( T arg, |
原子地以值和 arg 逐位異或的結(jié)果替換當(dāng)前值。運(yùn)算是讀修改寫(xiě)操作。按照 order 的值影響內(nèi)存。
參數(shù)
| arg | - | 逐位異或的另一參數(shù) |
| order | - | 強(qiáng)制的內(nèi)存順序制約 |
返回值
*this 的修改順序中立即前趨此函數(shù)效果的值。
總結(jié)
以上是生活随笔為你收集整理的c++ 11 原子操作库 (std::atomic)(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《JavaScript》条件运算符
- 下一篇: C++ 并发指南-atomic原子变量使