博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++原子操作atomic库介绍
阅读量:2429 次
发布时间:2019-05-10

本文共 931 字,大约阅读时间需要 3 分钟。

原子操作如名字所述,其操作是不可分割的操作。在多线程中,原子操作因不可分割性,对认识数据同步有这重要的作用,而且原子操作可以使用互斥锁进行模拟。标准原子类型定义在<atomic>头文件中,或许c++标志库中原子库的实现就是通过互斥锁模拟的,我们可以通过其方法is_lock_free()检测是否该类型内部是通过使用锁模拟的,若返回false则表示该原子类型是库或是编译器内部使用一个锁实现的。

<atomic>头文件中,有一个特殊的原子类型atomic_flag,该类型除了清除clear()和查询test_and_set()函数,不存在其他的操作,在使用前必须被初始化为ATOMIC_FLAG_INIT,而这个标志位相当于false状态,也就是说初始化总是为false;
atomic_flag atm_flg = ATOMIC_FLAG_INIT;
flg.clear();----清除标志
flg.test_and_set();----按照默认的内存顺序设置标志,并检索旧值。

程序如下:

在这里插入图片描述
其他的原子类型是可以通过模板atomic<>特化得到,eg:atomic<bool>b;定义一个bool类型的原子对象。
这与前面的atomic_flag存在差异,更接近于平常的bool类型数据,有着存储、加载、设置等操作。其他类型的atomic<>特化也有着相似的操作。具体操作函数如下图(图摘自c++ concurrency in action):
在这里插入图片描述
其中exchange(nwVal)直接将对象存储的值替换为新值,并返回以前存储的值。
compare_exchange_strong(expVal,val)对比交换,若期望值与存储的值不同,则将期望的值更新为存储的值,返回false;若相同,存储提供的val值,返回true。
compare_exchange_weak(expVal,val)不同的是,即使期望值和存储的值相同,也可能存储操作出现错误,从而返回false,造成这种情况的原因是时间。所以基本会使用一个循环进行检测。
注意:调用fetch_add()/fetch_sub()等操作,对象可以进行加/减等运算,但是返回的是原始值。
如下程序所示:
在这里插入图片描述

转载地址:http://qsjmb.baihongyu.com/

你可能感兴趣的文章
用 Docker Machine 一次创建上百台Docker Swarm集群主机的方法
查看>>
Docker Swarm 集群图形化显示工具 Visualizer的安装及注意事项
查看>>
Docker Swarm 集群的创建与管理几篇好文章
查看>>
使用Docker Machine时,如何用root身份操作Docker VM主机
查看>>
如何快速下载DockerToolbox?Boot2Docker? 使用国内开源镜像站点
查看>>
如何快速下载DockerToolbox?使用国内开源镜像站点
查看>>
Docker 官方镜像加速 registry.docker-cn.com
查看>>
【故障】旧版本的Docker Toolbox 无法正常运行的解决办法
查看>>
【脚本】一键安装指定版本 Docker 的脚本
查看>>
【备忘】使用 Docker Machine 创建虚拟机的脚本及参数
查看>>
【测速】使用不同的Docker镜像加速器下载速度 对比测试
查看>>
【编程】用for循环语句打印嵌套变量的值
查看>>
【手工解决】使用 DockerToolbox 创建指定版本的 Docker 虚拟机环境
查看>>
Docker 图形化管理工具 Portainer 使用概要
查看>>
Docker Swarm 集群创建+Portainer 图形化管理实验
查看>>
怎样截取Swarm集群令牌?shell命令输出的信息,截取其中一段,作为字符串变量
查看>>
Docker Toolbox 使用小技巧-复制粘贴-批量处理-循环语句-dm别名
查看>>
使用 Docker Toolbox 自动创建 Swarm 集群+Portainer 图形化管理的脚本
查看>>
在shell中创建文件的三种姿势-echo-cat-vi
查看>>
使用Docker Toolbox 创建Swarm集群的问题-概念混淆导致
查看>>