# std::atomic_flag

< cpp‎ | atomic

定义于头文件 `<atomic>` |  |
class atomic_flag; |  | (C++11 起)

`std::atomic_flag` 是原子布尔类型。不同于所有 std::atomic 的特化，它保证是免锁的。不同于 std::atomic<bool> ， `std::atomic_flag` 不提供加载或存储操作。

### 成员函数

(构造函数) | 构造 atomic_flag (公开成员函数)
operator= | 赋值运算符 (公开成员函数)
clear | 原子地设置标志为 false (公开成员函数)
test_and_set | 原子地设置标志为 true 并获得其先前值 (公开成员函数)
test (C++20) | 原子地返回标志的值 (公开成员函数)
wait (C++20) | 阻塞线程直至被提醒且原子值更改 (公开成员函数)
notify_one (C++20) | 提醒至少一个在原子对象上的等待中阻塞的线程 (公开成员函数)
notify_all (C++20) | 提醒所有在原子对象上的等待中阻塞的线程 (公开成员函数)

### 示例

可于用户空间用 atomic_flag 实现自旋互斥

    #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 (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(f, n);
        }
        for (auto& t : v) {
            t.join();
        }
    }

输出：

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

### 参阅

atomic_flag_test_and_set atomic_flag_test_and_set_explicit (C++11)(C++11) | 原子地设置标志为 true 并返回其先前值 (函数)
atomic_flag_clear atomic_flag_clear_explicit (C++11)(C++11) | 原子地设置标志值为 false (函数)
atomic_flag_wait atomic_flag_wait_explicit (C++20)(C++20) | 阻塞线程，直至被提醒且标志更改 (函数)
atomic_flag_notify_one (C++20) | 提醒一个在 `atomic_flag_wait` 中阻塞的线程 (函数)
atomic_flag_notify_all (C++20) | 提醒所有在 `atomic_flag_wait` 中阻塞的线程 (函数)