atomic_flag
查询状态std::atomic_flag
是 C++ 标准库中最简单的原子类型,用于实现自旋锁(spinlock)。它是一个布尔类型的原子变量,保证在多线程环境下对它的操作是原子的。
atomic_flag
的操作是原子的,不需要额外的同步机制。atomic_flag
只有两个状态(设置和未设置),使用起来非常简单。atomic_flag
的操作是原子的,且通常使用硬件级别的原子指令实现,因此在某些情况下比其他同步机制(如互斥锁)更高效。std::atomic_flag
只有一个类型,即 atomic_flag
。
std::atomic_flag
常用于实现自旋锁,适用于以下场景:
#include <iostream>
#include <thread>
#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::thread t1(f, 1);
std::thread t2(f, 2);
t1.join();
t2.join();
}
问题:为什么 atomic_flag
的操作是原子的?
原因:atomic_flag
的操作是原子的,因为它们通常是由硬件级别的原子指令实现的。这些指令保证了操作的原子性,即在执行过程中不会被其他线程中断。
解决方法:无需解决,这是 atomic_flag
的设计特性。
问题:如何使用 atomic_flag
实现自旋锁?
解决方法:通过 test_and_set
方法获取锁,如果锁已经被设置,则自旋等待;通过 clear
方法释放锁。示例代码如下:
while (lock.test_and_set(std::memory_order_acquire)) { // 获取锁
// 自旋等待
}
// 执行临界区代码
lock.clear(std::memory_order_release); // 释放锁
通过以上解释和示例代码,你应该能够理解 std::atomic_flag
的基本概念、优势、类型、应用场景以及如何使用它来实现自旋锁。
领取专属 10元无门槛券
手把手带您无忧上云