1. 程式人生 > >C++多執行緒-第一篇-Atomic-原子操作

C++多執行緒-第一篇-Atomic-原子操作

此係列基於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有更多定義,也更底層!