三个用于并发编程的组件:
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核心为了优化而调整代码或者指令的顺序执行

 

最新文章

  1. 深度剖析Linux与Windows系统的区别
  2. FileReader和FileWriter
  3. Silverlight项目笔记6:Linq求差集、交集&amp;检查网络连接状态&amp;重载构造函数复用窗口
  4. windows server 2012将计算机、回收站、文档等图标添加到桌面
  5. linux 系统启动流程
  6. IOS中 什么是UITableView的索引放大镜字符
  7. hadoop 数据采样
  8. 在非MFC程序中引用CString
  9. (转)tar 解压缩命令
  10. Spring 实现自定义 bean 的扩展
  11. 个人工作中ssd、audio python脚本总结
  12. springCloud Hystrix 断路由
  13. Oracle Inventory Management Application Program Interface ( APIs)
  14. 项目Alpha冲刺(团队)-第四天冲刺
  15. Angular组件——投影
  16. JavaWeb练习-网上名片管理系统
  17. Reachability
  18. go语言之行--简介与环境搭建
  19. Ubuntu终端命令行播放音乐(mp3)
  20. GNU Make中文手册(一)

热门文章

  1. spring+springmvc+hibernate 礼品管理系统
  2. Android Intent Service
  3. 面向对象设计原则 单一职责原则(Single responsibility principle)
  4. 快速沃尔什变换与k进制FWT
  5. [Java]struts2-spring整合时配置监听器
  6. java php c# 三种语言的AES加密互转
  7. 使用 IntraWeb (23) - 基本控件之 TIWTimer、TIWProgressBar、TIWProgressIndicator、TIWTimeEdit
  8. spring cloud 学习(4) - hystrix 服务熔断处理
  9. AutoMapper实际项目运用
  10. Java IO:同步、非堵塞式IO(NIO)