boost并发编程boost::atomic
2024-08-25 15:43:13
三个用于并发编程的组件:
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())以原子方式存取,不会因为并发访问导致数据不一致。
boost::atomic<bool> b();
assert(b != );
std::cout << b << std::endl; b.store();//存值
std::cout << b << std::endl; boost::atomic<int> n1();
std::cout << n1.exchange() << std::endl;//交换两个值,并且返回原值100
std::cout << n1 << std::endl; n1 = ;
int n2 = ;
n1.compare_exchange_weak(n2, );//n1 和 n2相比较,相等就输出313,如果不相等 n1 = n2 = 200;
std::cout << n1 << "\t" << n2 << std::endl;
//返回true 或 false 表示原值是否被修改
//区别为weak执行速度快,但有可能执行成功却返回false
n2 = ;
n1 = ;
n1.compare_exchange_strong(n2, );//功能与weak相同
std::cout << n1 << "\t" << n2 << std::endl; //整数atomic用法
boost::atomic<int> n3();
std::cout << n3.fetch_add() << std::endl;//加法操作返回原值
std::cout << n3 << std::endl;
//重载操作符后,都是返回运算后的值
std::cout << n3++ << std::endl;
std::cout << ++n3 << std::endl;
//二进制
//它使用boost.preprocessor预处理元编程工具将一组或多组01数字在编译期展开成为一个八进制数字。每个数字组之间可以用空格分隔,每组可以容纳1个到8个0/1数字。
//这里特别要注意的是,数字组的长度一定不能超过八个,由于预处理器宏展开的限制,嵌套层次太深会导致无法通过编译,报出一大堆错误。
//在编译时展开,没有任何运行时开销
boost::atomic<int> n4{ BOOST_BINARY() };// #include <boost/utility/binary.hpp> //或者 #include <boost/utility.hpp>
auto x = n4.fetch_and(BOOST_BINARY());//逻辑与运算,返回原值n4
std::cout << x << std::endl;
std::cout << n4 << std::endl;
实际上每一个atomic<T>成员函数都有一个memory——order缺省参数,指定了原子操作的内存顺序要求,不允许编译器或者cpu核心为了优化而调整代码或者指令的顺序执行
最新文章
- 深度剖析Linux与Windows系统的区别
- FileReader和FileWriter
- Silverlight项目笔记6:Linq求差集、交集&;检查网络连接状态&;重载构造函数复用窗口
- windows server 2012将计算机、回收站、文档等图标添加到桌面
- linux 系统启动流程
- IOS中 什么是UITableView的索引放大镜字符
- hadoop 数据采样
- 在非MFC程序中引用CString
- (转)tar 解压缩命令
- Spring 实现自定义 bean 的扩展
- 个人工作中ssd、audio python脚本总结
- springCloud Hystrix 断路由
- Oracle Inventory Management Application Program Interface ( APIs)
- 项目Alpha冲刺(团队)-第四天冲刺
- Angular组件——投影
- JavaWeb练习-网上名片管理系统
- Reachability
- go语言之行--简介与环境搭建
- Ubuntu终端命令行播放音乐(mp3)
- GNU Make中文手册(一)
热门文章
- spring+springmvc+hibernate 礼品管理系统
- Android Intent Service
- 面向对象设计原则 单一职责原则(Single responsibility principle)
- 快速沃尔什变换与k进制FWT
- [Java]struts2-spring整合时配置监听器
- java php c# 三种语言的AES加密互转
- 使用 IntraWeb (23) - 基本控件之 TIWTimer、TIWProgressBar、TIWProgressIndicator、TIWTimeEdit
- spring cloud 学习(4) - hystrix 服务熔断处理
- AutoMapper实际项目运用
- Java IO:同步、非堵塞式IO(NIO)