名前空間
変種
操作

std::atomic_exchange, std::atomic_exchange_explicit

提供: cppreference.com
< cpp‎ | atomic
 
 
 
ヘッダ <atomic> で定義
(1)(C++11以上)
template<class T >

T atomic_exchange(std::atomic<T>* obj,

                   typenamestd::atomic<T>::value_type desr )noexcept;
template<class T >

T atomic_exchange(volatilestd::atomic<T>* obj,

                   typenamestd::atomic<T>::value_type desr )noexcept;
(2)(C++11以上)
template<class T >

T atomic_exchange_explicit(std::atomic<T>* obj,
                            typenamestd::atomic<T>::value_type desr,

                            std::memory_order order )noexcept;
template<class T >

T atomic_exchange_explicit(volatilestd::atomic<T>* obj,
                            typenamestd::atomic<T>::value_type desr,

                            std::memory_order order )noexcept;
1)obj->exchange(desr) によって行われたかのように、 obj の指す値を desr の値でアトミックに置き換え、 obj がそれまで保持していた値を返します。
2)obj->exchange(desr, order) によって行われたかのように、 obj の指す値を desr の値でアトミックに置き換え、 obj がそれまで保持していた値を返します。

目次

[編集]引数

obj - 変更するアトミックオブジェクトを指すポインタ
desr - アトミックオブジェクトに格納する値
order - この操作に対するメモリ同期順序付け。 すべての値が指定できます。

[編集]戻り値

obj の指すアトミックオブジェクトがそれまで保持していた値。

[編集]

std::atomic_flag_test_and_set と同様に、アトミックな交換操作を使用してユーザ空間でスピンロックを実装できます。

#include <thread>#include <vector>#include <iostream>#include <atomic>   std::atomic<bool> lock(false);// holds true when locked// holds false when unlocked   void f(int n){for(int cnt =0; cnt <100;++cnt){while(std::atomic_exchange_explicit(&lock, true, std::memory_order_acquire));// spin until acquiredstd::cout<<"Output from thread "<< n <<'\n';std::atomic_store_explicit(&lock, false, std::memory_order_release);}}int main(){std::vector<std::thread> v;for(int n =0; n <10;++n){ v.emplace_back(f, n);}for(auto& t : v){ t.join();}}

出力:

Output from thread 2 Output from thread 6 Output from thread 7 ...<exactly 1000 lines>...

[編集]欠陥報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
P0558R1 C++11 exact type match required because T is deduced from multiple arguments T is deduced from the atomic argument only

[編集]関連項目

アトミックオブジェクトの値をアトミックに置き換え、以前保持されていた値を取得します
(std::atomic<T>のパブリックメンバ関数)[edit]
アトミックに、アトミックオブジェクトの値を非アトミック引数と比較し、等しければ交換を行い、等しくなければ読み込みます
(関数テンプレート)[edit]
アトミック操作の std::shared_ptr に対する特殊化
(関数テンプレート)
atomic_exchange, atomic_exchange_explicitC言語リファレンス
close