boost併發程式設計boost atomic

2022-05-05 07:54:08 字數 2098 閱讀 5253

三個用於併發程式設計的元件:

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...