全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++中的std::atomic_flag有什么用_c++最简单的原子类型与自旋锁【并发】

std::atomic_flag是最轻量的无锁原子类型,专为自旋锁设计,仅支持test_and_set()和clear()两个原子操作,不支持load/store、拷贝或赋值,必须显式初始化,保证lock-free实现。

std::atomic_flag 是 C++ 中最轻量、最底层的原子类型,专为实现自旋锁(spinlock)这类无锁同步原语而设计。它只支持两个操作:test_and_set()(置位并返回旧值)和clear()(清零),且保证这两个操作是原子的、不可中断的。它不提供 load/store 语义,也不支持拷贝或赋值——天生就是“开关型”工具。

为什么需要 atomic_flag?

在多线程环境下,有时需要极简、低开销的互斥控制,比如保护一小段关键代码、实现自定义锁、或构建更复杂的原子结构。mutex 太重(涉及系统调用、上下文切换),而 std::atomic 虽简单,但无法保证“测试+设置”是单个原子指令(可能被编译器或 CPU 拆分)。atomic_flag 则由标准强制要求必须以**无锁方式实现**(lock-free),通常直接映射到 CPU 的 test-and-setexchangecompare-and-swap 指令,真正做到了最小延迟。

怎么用它写一个自旋锁?

一个典型的、可复用的自旋锁实现如下:

(注意:实际项目中建议优先使用 std::mutex;自旋锁仅适用于临界区极短、且线程数 ≤ CPU 核心数的场景)

  • ATOMIC_FLAG_INIT 静态初始化(C++17 起可直接用 {} 初始化)
  • 构造时调用 test_and_set(std::memory_order_acquire) 尝试上锁;若返回 false,说明之前是未设置状态,成功获得锁
  • 循环重试直到成功(即“自旋”),每次用 std::this_thread::yield() 提示调度器让出时间片,避免空转霸占 CPU
  • 析构或解锁时调用 clear(std::memory_order_release),确保释放前的写操作对其他线程可见

atomic_flag 和 atomic 的关键区别

  • atomic_flag 一定是 lock-free 的;atomic 可能退化为内部加锁(罕见,但标准允许)
  • atomic_flag 不支持读取当前值(没有 load()),只能通过 test_and_set() “消耗性读取”
  • atomic_flag 不可拷贝、不可赋值、无默认构造函数(必须显式初始化)
  • 语义更纯粹:它不是“一个布尔原子变量”,而是“一个只能开关一次再清零的原子门闩”

一个最小可行示例

下面代码演示如何用 atomic_flag 保护一个共享计数器递增:

std::atomic_flag lock = ATOMIC_FLAG_INIT;
int counter = 0;

void increment() {
    while (lock.test_and_set(std::memory_order_acquire)) {
        std::this_thread::yield(); // 让出 CPU,减少忙等开销
    }
    ++counter;
    lock.clear(std::memory_order_release);
}

多个线程并发调用 increment() 时,只会有一个线程能“穿过”这个锁,其余线程在 test_and_set() 返回 true 后持续自旋等待,直到锁被释放。

基本上就这些。它不复杂,但容易忽略它的设计初衷——不是用来存状态,而是用来建同步机制的“砖块”。


# c++  # 工具  # 区别  # 无锁  # 同步机制  # 为什么  # 子类  # 构造函数  # 循环  # 线程  # 多线程  # 并发  # 不支持  # 专为  # 它不  # 最轻  # 清零  # 也不  # 多个  # 适用于  # 这两个  # 只会 


相关文章: 微信小程序 五星评分(包括半颗星评分)实例代码  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  建站之星导航如何优化提升用户体验?  如何快速搭建支持数据库操作的智能建站平台?  临沂网站制作企业,临沂第三中学官方网站?  北京企业网站设计制作公司,北京铁路集团官方网站?  建站之家VIP精选网站模板与SEO优化教程整合指南  ,网页ppt怎么弄成自己的ppt?  建站主机是否等同于虚拟主机?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  威客平台建站流程解析:高效搭建教程与设计优化方案  如何高效利用亚马逊云主机搭建企业网站?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何登录建站主机?访问步骤全解析  网站制作软件免费下载安装,有哪些免费下载的软件网站?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  建站org新手必看:2024最新搭建流程与模板选择技巧  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何快速搭建个人网站并优化SEO?  公司网站制作价格怎么算,公司办个官网需要多少钱?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  b2c电商网站制作流程,b2c水平综合的电商平台?  C++如何使用std::optional?(处理可选值)  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  如何在阿里云域名上完成建站全流程?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  建站之星免费版是否永久可用?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  兔展官网 在线制作,怎样制作微信请帖?  建站VPS选购需注意哪些关键参数?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  智能起名网站制作软件有哪些,制作logo的软件?  如何安全更换建站之星模板并保留数据?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何通过VPS建站无需域名直接访问?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  如何选择高性价比服务器搭建个人网站?  音响网站制作视频教程,隆霸音响官方网站?  如何用景安虚拟主机手机版绑定域名建站?  如何有效防御Web建站篡改攻击?  如何将凡科建站内容保存为本地文件?  Swift中循环语句中的转移语句 break 和 continue  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  高端建站如何打造兼具美学与转化的品牌官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。