1. 头文件

#include <atomic>

2. 功能

是原子布尔类型,它保证是无锁的(lock-free),且不提供加载或存储操作。

3. 成员函数

构造函数
  • atomic_flag() noexcept = default;
  • atomic_flag (const atomic_flag&T) = delete;
  • operator= is deleted (non-copyable/moveable)

说明:拷贝构造函数和赋值函数被禁用,不允许从一个atomic_flag对象构造另一个对象

clear 原子的设置标志为false
test_and_set 原子的设置标志为true,并获得其先前值
test(c++20) 原子的返回标志的值
wait(c++20) 阻塞线程直至被提醒且原子值更改
notify_one(c++20) 提醒至少一个在原子对象上的等待中阻塞的线程
notify_all(c++20) 提醒所有在原子对象上的等待中阻塞的线程

4. ATOMIC_FLAG_INIT宏

如果某个std::atomic_flag 对象使用该宏初始化,那么可以保证该 std::atomic_flag 对象在创建时处于 clear 状态,即标志为false。

5. std::atomic_flag::test_and_set

5.1 原型

bool test_and_set (memory_order sync = memory_order_seq_cst) volatile noexcept;
bool test_and_set (memory_order sync = memory_order_seq_cst) noexcept;

5.2 作用

test_and_set() 函数检查 std::atomic_flag 标志,如果 std::atomic_flag 之前没有被设置过,则设置 std::atomic_flag 的标志,并返回先前该 std::atomic_flag 对象是否被设置过,如果之前 std::atomic_flag 对象已被设置,则返回 true,否则返回 false。

test-and-set 操作是原子的(因此 test-and-set 是原子 read-modify-write (RMW)操作)。

test_and_set 可以指定 Memory Order(后续作补充):

Memory Order 值 Memory Order 类型
memory_order_relaxed Relaxed
memory_order_consume Consume
memory_order_acquire Acquire
memory_order_release Release
memory_order_acq_rel Acquire/Release
memory_order_seq_cst Sequentially consistent

6. std::atomic_flag::clear()

6.1 原型

void clear (memory_order sync = memory_order_seq_cst) volatile noexcept;
void clear (memory_order sync = memory_order_seq_cst) noexcept;

6.2 作用

清除 std::atomic_flag 标志使得下一次调用 std::atomic_flag::test_and_set 返回 false。

7. 自旋互斥

#include <thread>
#include <vector>
#include <iostream>
#include <atomic>std::atomic_flag lock = ATOMIC_FLAG_INIT;void myFunc(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::vector<std::thread> v;for (int n = 0; n < 10; ++n) {v.emplace_back(myFunc, n);}for (auto& t : v) {t.join();}
}

部分参考:

https://www.cnblogs.com/haippy/p/3252056.html

https://www.apiref.com/cpp-zh/cpp/atomic/atomic_flag.html

c++11总结21——atomic_flag相关推荐

  1. 有一列数列,1,11,21,1211,111221,.........,

    这是之前应聘某公司时遇到的一道算法题:当时思路是有的,步骤大概写出来了,但忽略了一些细节,导致没有完全做对:后来深入想了一下,进行了补全,题目和代码如下. 有一列数列,1,11,21,1211,111 ...

  2. 梦幻模拟战手游服务器维护,梦幻模拟战手游11月21日更新公告 执行者降临限时召唤开启[多图]...

    梦幻模拟战手游11月21日更新内容中开启了限时十连抽必得SR英雄哦,同时还有时空的轨迹SC秘境新挑战,接下来跟随安族大大来看看详细资讯详情吧,希望各位能够喜欢~ 梦幻模拟战手游11月21日更新公告 服 ...

  3. 11.15-11.21【大学生Python学习】社区总结+优秀社区成员点名表扬技术书籍和CSDN定制背包奖励~

      欢迎每一位小伙伴的加入: 社区:大学生Python学习   文章目录: 11.15-11.21的社区总结: 优秀群成员点名表扬&&技术书籍和CSDN定制背包奖励: 排名第一位:[X ...

  4. mongodb 安装记录 2017年11月21日

    mongodb 安装记录 问题 – 1 install window server 失败 [ 2017年11月21日 ] – 使用命令为: mongod --logpath "D:\Mong ...

  5. 2009 11月21日李兴华老师JAVA学习技术讲座

    为推动JAVA发展,让广大JAVA爱好者了解掌握JAVA/J2EE体系并确立学习方向,在周六特别为大家准备<JAVA开发者之路>技术讲座. 主讲介绍: 李兴华:MLDN魔乐科技 -- JA ...

  6. 面试经历---YY欢聚时代(2015年11月21日上午初试、25日下午复试)

    YY欢聚时代一年多前去面试过一次,当时鄙视了,在现在的公司呆了1年半了,感觉做得很不爽,而且薪资又不满意,所以想找个新工作,就想去YY面试. 下面将两次YY面试的经历写出来,包括一次初试和一次复试的面 ...

  7. 分享Silverlight/WPF/Windows Phone一周学习导读(11月21日-11月27日)

    分享Silverlight/WPF/Windows Phone一周学习导读(11月21日-11月27日) 本周Silverlight学习资源更新 Silverlight 利用Telerik导出到Wor ...

  8. 11月21日 iPhone 游戏开发技术聚会 总结

    11月21日 iPhone 游戏开发技术聚会总结 早上睁眼10点多了,本来计划上午看点OPENGL,抱抱佛脚之类的.不过还有衣服要洗,草草洗了衣服.12点多了,饭还没吃呢.路上草草吃了点东西,赶向会场 ...

  9. 360剑灵洪门崛起服务器维护,剑灵洪门崛起————【维护】11月21日更新维护公告...

    亲爱的玩家: 大家好! 为了更新游戏内容,提升游戏体验,7k7k<剑灵洪门崛起>将于11月21日7:00-8:00对所有服务器进行更新维护,维护期间无法登陆游戏,维护时间预计1小时. 如果 ...

  10. 宠物刷新服务器维护,2018年11月21日维护公告:宠物专属内丹更新

    亲爱的玩家朋友: 为保证服务器的运行稳定和服务质量,<梦幻西游>手游所有服务器将于2018年11月21日8:00停机,进行维护工作.预计维护时间为8:00-9:00.如果在预定时间内无法完 ...

最新文章

  1. 教你两种黑掉“人工智能”的方法
  2. python调用离线百度语音识别_python调用百度语音识别api
  3. 【Java 网络编程】TCP 简介
  4. 我用python是什么梗_Python中的一些梗
  5. 【备忘录】BADI_ACC_DOCUMENT增强实现
  6. How to resolve syntax error in CL_IM_CMS_SI_GEN_INTF
  7. VS里的新建模板(自动添加版本注释)
  8. python的setting怎么找_python代码中使用settings
  9. 港科大郑光廷院士问诊未来,揭露 AI 最新应用与实践
  10. java获取服务器超时_java – Eclipse中的Tomcat服务器超时
  11. 信息系统项目管理师 pdf_关于系统集成项目管理工程师和信息系统项目管理师的区别...
  12. 原来黑客长这样(中国大陆篇)
  13. 【信号与系统学习笔记】—— 拉普拉斯变换的性质分析
  14. 新冠肺炎的诊断与临床症状
  15. 什么是毫米波雷达?飞睿科技雷达传感器,雷达感应技术
  16. vue 监听输入法方法(js)
  17. 在EXCEL表格中如何快速换行
  18. JAVA微信开发-新手接入指南
  19. 【Distill 系列:二】CVPR 2019 Distilling Object Detectors with Fine-grained Feature Imitation
  20. 数据库根据身份证号码判别性别

热门文章

  1. 那些年我们踩过的坑——Java中Date夏令时日期转换不一致问题
  2. ucdavis计算机科学专业,UCDavis的ECE「加州大学戴维斯分校电气与计算机工程系」...
  3. history linux 位置,Linux基础知识之history的详细说明
  4. [1140]linux查看历史命令history
  5. BIGEMAP如何添加在线第三方地图
  6. json_encode函数参数详解
  7. Android开发:toast封装工具类
  8. python挑选以元音字母开头的单词_帮我总结一下,元音字母开头但是读音是辅音的英语单词例如uniform看上去应该是anuniform但事实是auniform的...
  9. MPLS排错练习题分享
  10. 红帽企业linux8,红帽企业Linux8登场