std::atomic_flag_test_and_set, std::atomic_flag_test_and_set_explicit
来自cppreference.com
| 在标头 <atomic> 定义
|
||
| |
(1) | (C++11 起) |
| |
(2) | (C++11 起) |
| |
(3) | (C++11 起) |
| |
(4) | (C++11 起) |
将 std::atomic_flag 的状态原子地更改为设置(true),并返回它先前保有的值。此操作是读-修改-写操作。按照指定的内存同步定序影响内存。
1,2) 内存同步定序是
std::memory_order_seq_cst。3,4) 内存同步定序是
order。参数
| obj | - | 指向要访问的 std::atomic_flag 的指针 |
| order | - | 内存同步定序 |
返回值
obj 所指向的标志先前保有的值。
示例
可以通过 std::atomic_flag 在用户空间实现自旋锁互斥体。
运行此代码
#include <atomic>
#include <iostream>
#include <thread>
#include <vector>
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))
; // 在获取到锁之前自旋
std::cout << "从线程 " << 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();
}
输出:
从线程 2 输出
从线程 6 输出
从线程 7 输出
...< 1000 行 >...
参阅
(C++11) |
免锁的布尔原子类型 (类) |
(C++11)(C++11) |
原子地设置标志值为 false (函数) |
(C++11) |
为给定的原子操作定义内存定序约束 (枚举) |
atomic_flag_test_and_set, atomic_flag_test_and_set_explicit 的 C 文档
| |