此系列基于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:
#include<iostream>
#include<boost/atomic.hpp>
#include<boost/utility/binary.hpp>
using namespace std;
using namespace boost;
atomic<int> a(10);
//assert(a.fetch_add(10) == 10);
//assert(a == 10);
assert(++a == 11);
assert(a++ == 11);
cout << a.load() << endl;
atomic<int> b{BOOST_BINARY (1101)};
auto x = b.fetch_and(BOOST_BINARY(0110));//逻辑与
assert(x == BOOST_BINARY(1101) && b == BOOST_BINARY(0100));//b = 0100
assert(b |= BOOST_BINARY(0100) == BOOST_BINARY(1101)); // b = 1101
cout << b.load() << endl;
atomic<bool> c{ true };
//atomic<bool> c( true );
assert(c);
c = false;
assert(!c.load());
auto xx = c.exchange(true);
cout << xx << endl;
assert(b && !xx);
关于并发顺序一致性:
多CPU并发中,编译器与CPU的优化都可能打乱指令执行顺序,虽然可能提高效率,但有时我们并不想要这样子(代码不按照我们所想顺序而执行)。
Atomic库在<boost/memory_order.hpp>中定义内存访问顺序概念。
C++11有更多定义,也更底层!