C++多執行緒-第一篇-Atomic-原子操作
阿新 • • 發佈:2019-01-06
此係列基於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有更多定義,也更底層!