1. 头文件
#include <atomic>
2. 功能
是原子布尔类型,它保证是无锁的(lock-free),且不提供加载或存储操作。
3. 成员函数
构造函数 |
- atomic_flag() noexcept = default;
- atomic_flag (const atomic_flag&T) = delete;
- operator=?is deleted (non-copyable/moveable)
说明:拷贝构造函数和赋值函数被禁用,不允许从一个atomic_flag对象构造另一个对象 | clear | 原子的设置标志为false | test_and_set | 原子的设置标志为true,并获得其先前值 | test(c++20) | 原子的返回标志的值 | wait(c++20) | 阻塞线程直至被提醒且原子值更改 | notify_one(c++20) | 提醒至少一个在原子对象上的等待中阻塞的线程 | notify_all(c++20) | 提醒所有在原子对象上的等待中阻塞的线程 |
4. ATOMIC_FLAG_INIT宏
如果某个std::atomic_flag 对象使用该宏初始化,那么可以保证该 std::atomic_flag 对象在创建时处于 clear 状态,即标志为false。
5.?std::atomic_flag::test_and_set
5.1 原型
bool test_and_set (memory_order sync = memory_order_seq_cst) volatile noexcept;
bool test_and_set (memory_order sync = memory_order_seq_cst) noexcept;
5.2 作用
test_and_set() 函数检查 std::atomic_flag 标志,如果 std::atomic_flag 之前没有被设置过,则设置 std::atomic_flag 的标志,并返回先前该 std::atomic_flag 对象是否被设置过,如果之前 std::atomic_flag 对象已被设置,则返回 true,否则返回 false。
test-and-set 操作是原子的(因此 test-and-set 是原子?read-modify-write?(RMW)操作)。
test_and_set 可以指定 Memory Order(后续作补充):
Memory Order 值 | Memory Order 类型 |
---|
memory_order_relaxed | Relaxed | memory_order_consume | Consume | memory_order_acquire | Acquire | memory_order_release | Release | memory_order_acq_rel | Acquire/Release | memory_order_seq_cst | Sequentially consistent |
6.?std::atomic_flag::clear()
6.1?原型
void clear (memory_order sync = memory_order_seq_cst) volatile noexcept;
void clear (memory_order sync = memory_order_seq_cst) noexcept;
6.2 作用
清除 std::atomic_flag 标志使得下一次调用 std::atomic_flag::test_and_set 返回 false。
7. 自旋互斥
#include <thread>
#include <vector>
#include <iostream>
#include <atomic>
std::atomic_flag lock = ATOMIC_FLAG_INIT;
void myFunc(int n)
{
for (int cnt = 0; cnt < 100; ++cnt) {
while (lock.test_and_set(std::memory_order_acquire)) // 获得锁
; // 自旋
std::cout << "Output from thread " << n << '\n';
lock.clear(std::memory_order_release); // 释放锁
}
}
int main()
{
std::vector<std::thread> v;
for (int n = 0; n < 10; ++n) {
v.emplace_back(myFunc, n);
}
for (auto& t : v) {
t.join();
}
}
部分参考:
https://www.cnblogs.com/haippy/p/3252056.html
https://www.apiref.com/cpp-zh/cpp/atomic/atomic_flag.html
|