std::atomic_flag表示一个布尔标志。

#include <atomic>

int main() {
    // 初始化
    std::atomic_flag val = ATOMIC_FLAG_INIT;
    // 置零 clear是存储操作 
    val.clear(std::memory_order_release);
    // 读取原有值并设置标志成立 "读-改-写"操作
    // 获取旧值并设置标志成立
    bool x = val.test_and_set();
    // 销毁操作(即析构)
    return 0;
}

下面使用std::atomic_flag实现自旋锁互斥

  • 原子标志置0,表示互斥没有加锁
  • 反复调用test_and_set试着锁住互斥
  • 一旦读取的值变成false,说明标志已经设置成立,循环终止

std::atomic_flag只能由test_and_set读取值,一旦执行该函数就必然伴随着写出。并不是单纯的读