三個用於併發程式設計的元件:
atomic,thread,asio(用於同步和非同步io操作)
atomic,封裝了不同計算機硬體的底層操作原語,提供了跨平台的原子操作功能,解決併發競爭讀寫變數的困擾。
包含標頭檔案,
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、atomica(10);
assert(a==10);//安全函式,若表示式不成立結束程式
2、atomicl;
cout << l<
1 boost::atomic b(1);2 assert(b != 0
);3 std::cout << b <45 b.store(0);//
存值6 std::cout << b <78 boost::atomic n1(100
);9 std::cout << n1.exchange(200) << std::endl;//
交換兩個值,並且返回原值100
10 std::cout << n1 <1112
13 n1 = 200;14
int n2 = 201
;15 n1.compare_exchange_weak(n2, 313);//
n1 和 n2相比較,相等就輸出313,如果不相等 n1 = n2 = 200;
16 std::cout << n1 << "\t"
<< n2 <17//
返回true 或 false 表示原值是否被修改
18//
區別為weak執行速度快,但有可能執行成功卻返回false
19 n2 = 201
;20 n1 = 2000
;21 n1.compare_exchange_strong(n2, 313);//
功能與weak相同
22 std::cout << n1 << "\t"
<< n2 <2324
//整數atomic用法
25 boost::atomic n3(10
);26 std::cout << n3.fetch_add(10) << std::endl;//
加法操作返回原值
27 std::cout << n3 <28//
過載操作符後,都是返回運算後的值
29 std::cout << n3++ <30 std::cout << ++n3 <31//
二進位制32
//它使用boost.preprocessor預處理元程式設計工具將一組或多組01數字在編譯期展開成為乙個八進位制數字。每個數字組之間可以用空格分隔,每組可以容納1個到8個0/1數字。
33//
這裡特別要注意的是,數字組的長度一定不能超過八個,由於預處理器巨集展開的限制,巢狀層次太深會導致無法通過編譯,報出一大堆錯誤。
34//
在編譯時展開,沒有任何執行時開銷
35 boost::atomic n4;//
#include
//或者 #include
36 auto x = n4.fetch_and(boost_binary(0101));//
邏輯與運算,返回原值n4
37 std::cout << x <38 std::cout << n4 << std::endl;
實際上每乙個atomic成員函式都有乙個memory——order預設引數,指定了原子操作的記憶體順序要求,不允許編譯器或者cpu核心為了優化而調整**或者指令的順序執行
Boost併發程式設計之shared mutex
shared mutex即讀寫鎖,不同與我們常用的獨佔式鎖mutex,shared mutex是共享與獨佔共存的鎖,實現了讀寫鎖的機制,即多個讀執行緒乙個寫執行緒,通常用於對於乙個共享區域的讀操作比較頻繁,而寫操作比較少的情況。讀寫鎖比起mutex具有更高的適用性,具有更高的並行性,可以有多個執行緒...
boost併發程式設計 多執行緒
原子操作,基本都包含我們三個方面所關心的語義 操作本身是不可分割的 atomicity 乙個執行緒對某個資料的操作何時對另外乙個執行緒可見 visibility 執行的順序是否可以被重排 ordering include include include using namespace std usi...
boost併發程式設計(一) 互斥鎖
這個系列其實是 boost程式庫完全開發指南 的讀書筆記。按照書中的方法 沒跑起來,所以轉到ubuntu下學習了。boost庫在ubuntu下的安裝,直接用apt get install命令安裝就可以了,需要安裝libboost dev libboost system libboost thread...