std::atomic_flag是最简单的标准原子类型,他代表一个布尔标识,没有拷贝构造函数和拷贝赋值运算符(=delete)。
std::atomic_flag对象可以是两种状态之一:设置或清除,且必须用ATOMIC_FLAG_INIT初始化,这会将该标志初始化为清除状态(此标志总是以清除状态初始化的),如下:
std::atomic_flag flag=ATOMIC_FLAG_INIT;
一旦标识对象初始化完成,只能做三种操作:销毁、清除或设置并查询其先前的值。这些分别对应析构函数、clear()函数以及test_and_set()函数。clear和test_and_set操作都可以指定一个内存顺序,clear是存储操作,test_and_set是读改写操作,指定内存顺序相关参见C++在线文档 https://zh.cppreference.com/w/cpp/atomic/memory_order。
在原子类型上的每一个操作均具有一个可选的内存顺序参数,它可以用来指定所需的内存顺序语义。存储(store)操作:可以包括memory_order_relaxed、memory_order_release、memory_order_seq_cst顺序。载入(load)操作:可以包括memory_order_relaxed、memory_order_consume、memory_order_acquire、memory_order_seq_cst顺序。读改写(read-modify-write)操作:可以包括memory_order_relaxed、memory_order_consume、memory_order_acquire、memory_order_release、memory_order_acq_rel、memory_order_seq_cst顺序。默认的顺序为memory_order_seq_cst。
C++在线手册上提供了一个实现自旋锁得例子:
#include
#include
#include
#include
std::atomic_flag lock = ATOMIC_FLAG_INIT;
void f(int n)
{
for (int cnt = 0; cnt < 5; ++cnt) {
while (lock.test_and_set(std::memory_order_acquire)) // 获得锁
; // 自旋
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?