std::atomic_exchange, std::atomic_exchange_explicit
提供: cppreference.com
ヘッダ <atomic> で定義
|
||
(1) | (C++11以上) | |
template< class T > T atomic_exchange( std::atomic<T>* obj, |
||
template< class T > T atomic_exchange( volatile std::atomic<T>* obj, |
||
(2) | (C++11以上) | |
template< class T > T atomic_exchange_explicit( std::atomic<T>* obj, |
||
template< class T > T atomic_exchange_explicit( volatile std::atomic<T>* obj, |
||
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 と同様に、アトミックな交換操作を使用してユーザ空間でスピンロックを実装できます。
Run this code
#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 acquired std::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> のパブリックメンバ関数)
| |
アトミックに、アトミックオブジェクトの値を非アトミック引数と比較し、等しければ交換を行い、等しくなければ読み込みます (関数テンプレート) |
アトミック操作の std::shared_ptr に対する特殊化 (関数テンプレート) | |
atomic_exchange, atomic_exchange_explicit の C言語リファレンス
|