C++多线程-第一篇-Atomic-原子操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hffhjh111/article/details/53140769

此系列基于Boost库多线程,但是大部分都在C++11中已经实现,所以两者基本一致。没什么特殊要求,练手还是C++11吧,方便不用配置。

PS:Boost不愧为C++准标准库。

本来不打算写,毕竟都是书上的内容,但是后来发现查书太麻烦,所以动手写了这个系列,帮助我只看代码使用多线程。

才疏学浅,如有错误,请多多指教。:-D




Atomic-原子操作(不可中断操作)

//Boost

#include <boost/atomic.hpp> 

Using namespace boost;

//C++11

#include <atomic>

using namespace std;



实现:

通过一个Atomic<>泛型类来定义了一系列关于该值的原子操作,

这些原子操作不可被打断。

原子操作数最好在初始化时赋值,否在并发时会发生不可预知的错误。

用处:

其优秀的重载,使其在多CPU并发中可安全访问,可担当计数器或者标志位的角色,还可以用作其他。

关于该值的操作是不可中断的,所以该怎么用看情况即可。

Code:


  
  
  1. #include<iostream>
  2. #include<boost/atomic.hpp>
  3. #include<boost/utility/binary.hpp>
  4. using namespace std;
  5. using namespace boost;
  6. atomic< int> a( 10);
  7. //assert(a.fetch_add(10) == 10);
  8. //assert(a == 10);
  9. assert(++a == 11);
  10. assert(a++ == 11);
  11. cout << a.load() << endl;
  12. atomic< int> b{BOOST_BINARY ( 1101)};
  13. auto x = b.fetch_and(BOOST_BINARY( 0110)); //逻辑与
  14. assert(x == BOOST_BINARY( 1101) && b == BOOST_BINARY( 0100)); //b = 0100
  15. assert(b |= BOOST_BINARY( 0100) == BOOST_BINARY( 1101)); // b = 1101
  16. cout << b.load() << endl;
  17. atomic< bool> c{ true };
  18. //atomic<bool> c( true );
  19. assert(c);
  20. c = false;
  21. assert(!c.load());
  22. auto xx = c.exchange( true);
  23. cout << xx << endl;
  24. assert(b && !xx);

 

关于并发顺序一致性: 

CPU并发中,编译器与CPU的优化都可能打乱指令执行顺序,虽然可能提高效率,但有时我们并不想要这样子(代码不按照我们所想顺序而执行)。

Atomic库在<boost/memory_order.hpp>中定义内存访问顺序概念。

C++11有更多定义,也更底层!



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hffhjh111/article/details/53140769

猜你喜欢

转载自blog.csdn.net/monk1992/article/details/82868476