C++中的atomic_flag是一种原子布尔类型,用于实现简单的原子操作。它通常用于实现自旋锁或其他需要原子性标记的场景。
atomic_flag只有两个成员函数:
clear():将atomic_flag设置为未被占用状态。test_and_set():尝试将atomic_flag设置为已被占用状态,并返回之前的状态。如果之前是未被占用状态,则成功设置并返回false;如果之前是已被占用状态,则保持不变并返回true。
下面是一个简单示例,演示了如何使用atomic_flag实现一个自旋锁:
#include <iostream>
#include <atomic>
#include <thread>
std::atomic_flag lock = ATOMIC_FLAG_INIT;
void criticalSection()
{
while (lock.test_and_set(std::memory_order_acquire)) // 尝试获取锁
; // 自旋等待,直到获取到锁
// 在临界区内执行操作
lock.clear(std::memory_order_release); // 释放锁
}
int main()
{
std::thread t1(criticalSection);
std::thread t2(criticalSection);
t1.join();
t2.join();
return 0;
}
上述示例中,两个线程通过自旋来竞争获取lock,只有一个线程能够成功获取到锁进入临界区执行操作。这样可以确保在任意时刻只有一个线程访问临界区,实现了简单的互斥。
内容由零声教学AI助手提供,问题来源于学员提问




