c++11总结21——atomic_flag
1. 头文件
#include <atomic>
2. 功能
是原子布尔类型,它保证是无锁的(lock-free),且不提供加载或存储操作。
3. 成员函数
构造函数 |
说明:拷贝构造函数和赋值函数被禁用,不允许从一个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,11,21,1211,111221,.........,
这是之前应聘某公司时遇到的一道算法题:当时思路是有的,步骤大概写出来了,但忽略了一些细节,导致没有完全做对:后来深入想了一下,进行了补全,题目和代码如下. 有一列数列,1,11,21,1211,111 ...
- 梦幻模拟战手游服务器维护,梦幻模拟战手游11月21日更新公告 执行者降临限时召唤开启[多图]...
梦幻模拟战手游11月21日更新内容中开启了限时十连抽必得SR英雄哦,同时还有时空的轨迹SC秘境新挑战,接下来跟随安族大大来看看详细资讯详情吧,希望各位能够喜欢~ 梦幻模拟战手游11月21日更新公告 服 ...
- 11.15-11.21【大学生Python学习】社区总结+优秀社区成员点名表扬技术书籍和CSDN定制背包奖励~
欢迎每一位小伙伴的加入: 社区:大学生Python学习 文章目录: 11.15-11.21的社区总结: 优秀群成员点名表扬&&技术书籍和CSDN定制背包奖励: 排名第一位:[X ...
- mongodb 安装记录 2017年11月21日
mongodb 安装记录 问题 – 1 install window server 失败 [ 2017年11月21日 ] – 使用命令为: mongod --logpath "D:\Mong ...
- 2009 11月21日李兴华老师JAVA学习技术讲座
为推动JAVA发展,让广大JAVA爱好者了解掌握JAVA/J2EE体系并确立学习方向,在周六特别为大家准备<JAVA开发者之路>技术讲座. 主讲介绍: 李兴华:MLDN魔乐科技 -- JA ...
- 面试经历---YY欢聚时代(2015年11月21日上午初试、25日下午复试)
YY欢聚时代一年多前去面试过一次,当时鄙视了,在现在的公司呆了1年半了,感觉做得很不爽,而且薪资又不满意,所以想找个新工作,就想去YY面试. 下面将两次YY面试的经历写出来,包括一次初试和一次复试的面 ...
- 分享Silverlight/WPF/Windows Phone一周学习导读(11月21日-11月27日)
分享Silverlight/WPF/Windows Phone一周学习导读(11月21日-11月27日) 本周Silverlight学习资源更新 Silverlight 利用Telerik导出到Wor ...
- 11月21日 iPhone 游戏开发技术聚会 总结
11月21日 iPhone 游戏开发技术聚会总结 早上睁眼10点多了,本来计划上午看点OPENGL,抱抱佛脚之类的.不过还有衣服要洗,草草洗了衣服.12点多了,饭还没吃呢.路上草草吃了点东西,赶向会场 ...
- 360剑灵洪门崛起服务器维护,剑灵洪门崛起————【维护】11月21日更新维护公告...
亲爱的玩家: 大家好! 为了更新游戏内容,提升游戏体验,7k7k<剑灵洪门崛起>将于11月21日7:00-8:00对所有服务器进行更新维护,维护期间无法登陆游戏,维护时间预计1小时. 如果 ...
- 宠物刷新服务器维护,2018年11月21日维护公告:宠物专属内丹更新
亲爱的玩家朋友: 为保证服务器的运行稳定和服务质量,<梦幻西游>手游所有服务器将于2018年11月21日8:00停机,进行维护工作.预计维护时间为8:00-9:00.如果在预定时间内无法完 ...
最新文章
- 教你两种黑掉“人工智能”的方法
- python调用离线百度语音识别_python调用百度语音识别api
- 【Java 网络编程】TCP 简介
- 我用python是什么梗_Python中的一些梗
- 【备忘录】BADI_ACC_DOCUMENT增强实现
- How to resolve syntax error in CL_IM_CMS_SI_GEN_INTF
- VS里的新建模板(自动添加版本注释)
- python的setting怎么找_python代码中使用settings
- 港科大郑光廷院士问诊未来,揭露 AI 最新应用与实践
- java获取服务器超时_java – Eclipse中的Tomcat服务器超时
- 信息系统项目管理师 pdf_关于系统集成项目管理工程师和信息系统项目管理师的区别...
- 原来黑客长这样(中国大陆篇)
- 【信号与系统学习笔记】—— 拉普拉斯变换的性质分析
- 新冠肺炎的诊断与临床症状
- 什么是毫米波雷达?飞睿科技雷达传感器,雷达感应技术
- vue 监听输入法方法(js)
- 在EXCEL表格中如何快速换行
- JAVA微信开发-新手接入指南
- 【Distill 系列:二】CVPR 2019 Distilling Object Detectors with Fine-grained Feature Imitation
- 数据库根据身份证号码判别性别
热门文章
- 那些年我们踩过的坑——Java中Date夏令时日期转换不一致问题
- ucdavis计算机科学专业,UCDavis的ECE「加州大学戴维斯分校电气与计算机工程系」...
- history linux 位置,Linux基础知识之history的详细说明
- [1140]linux查看历史命令history
- BIGEMAP如何添加在线第三方地图
- json_encode函数参数详解
- Android开发:toast封装工具类
- python挑选以元音字母开头的单词_帮我总结一下,元音字母开头但是读音是辅音的英语单词例如uniform看上去应该是anuniform但事实是auniform的...
- MPLS排错练习题分享
- 红帽企业linux8,红帽企业Linux8登场