std::atomic_flag_test_and_set, std::atomic_flag_test_and_set_explicit
提供: cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num t-dcl-rev-notes t-since-cxx11 ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num t-dcl-rev-notes t-since-cxx11 ">
</tbody><tbody>
</tbody>
| ヘッダ <atomic> で定義
|
||
| (1) | (C++11以上) | |
bool atomic_flag_test_and_set( volatile std::atomic_flag* p ) noexcept; |
||
bool atomic_flag_test_and_set( std::atomic_flag* p ) noexcept; |
||
| (2) | (C++11以上) | |
bool atomic_flag_test_and_set_explicit( volatile std::atomic_flag* p, std::memory_order order ) noexcept; |
||
bool atomic_flag_test_and_set_explicit( std::atomic_flag* p, std::memory_order order ) noexcept; |
||
p の指す std::atomic_flag の状態をセット (true) にアトミックに変更し、それまで保持していた値を返します。
引数
| p | - | アクセスする std::atomic_flag を指すポインタ |
| order | - | この操作に対するメモリ同期順序付け |
戻り値
p の指すフラグがそれまで保持していた値。
実装例
| 1つめのバージョン |
|---|
bool atomic_flag_test_and_set(volatile std::atomic_flag* p)
{
return p->test_and_set();
}
|
| 2つめのバージョン |
bool atomic_flag_test_and_set(std::atomic_flag* p)
{
return p->test_and_set();
}
|
| 3つめのバージョン |
bool atomic_flag_test_and_set_explicit(volatile std::atomic_flag* p,
std::memory_order order)
{
return p->test_and_set(order);
}
|
| 4つめのバージョン |
bool atomic_flag_test_and_set_explicit(std::atomic_flag* p,
std::memory_order order)
{
return p->test_and_set(order);
}
|
例
atomic_flag を使用してユーザ空間でスピンロックを実装できます。
Run this code
#include <thread>
#include <vector>
#include <iostream>
#include <atomic>
std::atomic_flag lock = ATOMIC_FLAG_INIT;
void f(int n)
{
for (int cnt = 0; cnt < 100; ++cnt) {
while(std::atomic_flag_test_and_set_explicit(&lock, std::memory_order_acquire))
; // spin until the lock is acquired
std::cout << "Output from thread " << n << '\n';
std::atomic_flag_clear_explicit(&lock, 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++11) |
ロックフリーなアトミックブーリアン型 (クラス) |
(C++11)(C++11) |
アトミックにフラグの値を false に設定します (関数) |
(C++11) |
指定されたアトミック操作のメモリ順序制約を定義します (列挙) |
atomic_flag_test_and_set, atomic_flag_test_and_set_explicit の C言語リファレンス
| |