当前位置: 首页 > news >正文

boost并发编程boost::atomic

三个用于并发编程的组件:
atomic,thread,asio(用于同步和异步io操作)
 

atomic

atomic,封装了不同计算机硬件的底层操作原语,提供了跨平台的原子操作功能,解决并发竞争读写变量的困扰。
包含头文件<boost/atomic.hpp>,

atomic可以把对类型T的操作原子化,T的要求:
1.标量类型,(算数,枚举,指针)
2.只有平凡拷贝/转移构造、赋值和析构函数的类,并且可以使用memcmp执行比操作,通常这样的类都是pod
注:int memcmp(const void *buf1, const void *buf2, unsigned int count);
比较内存区域buf1和buf2的前count个字节。
atomic针对整数类型和指针类型进行特化,增加一些特殊操作。并定义了typedef。

基本操作:
两种方式创建atomic对象:
1、atomic<int> a(10);
assert(a==10);//安全函数,若表达式不成立结束程序
2、atomic<long> L;
cout << L<<endl;//初始值不确定
最重要的两个成员函数:
store()(operator=) 和 load()(operator T())以原子方式存取,不会因为并发访问导致数据不一致。

 1     boost::atomic<bool> b(1);
 2     assert(b != 0);
 3     std::cout << b << std::endl;
 4  
 5     b.store(0);//存值
 6     std::cout << b << std::endl;
 7  
 8     boost::atomic<int> n1(100);
 9     std::cout << n1.exchange(200) << std::endl;//交换两个值,并且返回原值100
10     std::cout << n1 << std::endl;
11  
12  
13     n1 = 200;
14     int n2 = 201;
15     n1.compare_exchange_weak(n2, 313);//n1 和 n2相比较,相等就输出313,如果不相等 n1 = n2 = 200;
16     std::cout << n1 << "\t" << n2 << std::endl;
17     //返回true 或 false 表示原值是否被修改
18     //区别为weak执行速度快,但有可能执行成功却返回false
19     n2 = 201;
20     n1 = 2000;
21     n1.compare_exchange_strong(n2, 313);//功能与weak相同
22     std::cout << n1 << "\t" << n2 << std::endl;
23  
24     //整数atomic用法
25     boost::atomic<int> n3(10);
26     std::cout << n3.fetch_add(10) << std::endl;//加法操作返回原值
27     std::cout << n3 << std::endl;
28     //重载操作符后,都是返回运算后的值
29     std::cout << n3++ << std::endl;
30     std::cout << ++n3 << std::endl;
31     //二进制
32     //它使用boost.preprocessor预处理元编程工具将一组或多组01数字在编译期展开成为一个八进制数字。每个数字组之间可以用空格分隔,每组可以容纳1个到8个0/1数字。
33     //这里特别要注意的是,数字组的长度一定不能超过八个,由于预处理器宏展开的限制,嵌套层次太深会导致无法通过编译,报出一大堆错误。
34     //在编译时展开,没有任何运行时开销
35     boost::atomic<int> n4{ BOOST_BINARY(1101) };//    #include <boost/utility/binary.hpp>     //或者  #include <boost/utility.hpp> 
36     auto x = n4.fetch_and(BOOST_BINARY(0101));//逻辑与运算,返回原值n4
37     std::cout << x << std::endl;
38     std::cout << n4 << std::endl;

实际上每一个atomic<T>成员函数都有一个memory——order缺省参数,指定了原子操作的内存顺序要求,不允许编译器或者cpu核心为了优化而调整代码或者指令的顺序执行

 

转载于:https://www.cnblogs.com/fnlingnzb-learner/p/10334945.html

相关文章:

  • JS代码和网页的混用
  • 二叉树的序列化和反序列化(先序,按层序列化),包含递归图
  • 创建漫游用户配置文件
  • 一些模板
  • cnblogs bug(1)
  • poj 2186
  • 好男人找不到女朋友的原因
  • 浅入深出Vue:前言
  • 交换两个变量
  • 使用open flash chart的BarGlass时遇到的问题
  • 09视图
  • 什么是高并发 ,详细讲解
  • Struts Nested标签
  • Codeforces Global Round 1
  • (转)母版页和相对路径
  • conda常用的命令
  • Hibernate【inverse和cascade属性】知识要点
  • leetcode讲解--894. All Possible Full Binary Trees
  • NSTimer学习笔记
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue.js-Day01
  • Vue组件定义
  • 关于extract.autodesk.io的一些说明
  • 前端js -- this指向总结。
  • 深入浏览器事件循环的本质
  • 使用 @font-face
  • 树莓派 - 使用须知
  • 跳前端坑前,先看看这个!!
  • Semaphore
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​什么是bug?bug的源头在哪里?
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (+4)2.2UML建模图
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (day 12)JavaScript学习笔记(数组3)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (搬运以学习)flask 上下文的实现
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .net 7 上传文件踩坑
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net web项目 调用webService
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET中的十进制浮点类型,徐汇区网站设计
  • [Bada开发]初步入口函数介绍
  • [BetterExplained]书写是为了更好的思考(转载)
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [C++]类和对象【下】
  • [CF703D]Mishka and Interesting sum/[BZOJ5476]位运算