詳解c 多執行緒(四)

2022-08-05 09:30:16 字數 2040 閱讀 1075

為了避免多個執行緒同時修改全域性變數,c++11除了提供互斥量mutex這種方法以外,還提供了atomic模版函式。

使用atomic可以避免使用鎖,而且更加底層,比mutex效率更高。

為了方便使用,c++11為模版函式提供了別名。

atomic別名:atomic_bool  

atomic別名:atomic_int

atomic別名:atomic_char 

atomic別名:atomic_long 

我們先來看乙個例子:

#include #include 

#include

#include

using

namespace

std;

void func(int&counter)

}int

main()

for (auto¤t_thread : threads)

cout

<< "

result =

"<< counter << '\n'

;

return0;

}

輸出結果:

顯然這個結果不是我們想要的,多跑幾次就會發現,每一次的結果都會不一樣。而這段**的問題就在於多個執行緒同時修改了counter這個數導致出現錯誤。

了解了前幾章以後知道了鎖可以用來解決這個問題,但是其實原子型別可以更加方便得解決這個問題。

只需要把counter的原來的int型,改為atomic_int型就可以了,非常方便,也不需要用到鎖。

#include #include 

#include

#include

using

namespace

std;

void func(atomic_int&counter)

}int

main()

for (auto¤t_thread : threads)

cout

<< "

result =

"<< counter << '\n'

;

return0;

}

輸出結果: 

結果就正確了。

std::atomic_flag是乙個原子型的布林變數,只有兩個操作:

1)test_and_set,如果atomic_flag 物件已經被設定了,就返回true,如果未被設定,就設定之然後返回false

2)clear,把atomic_flag物件清掉

注意這個所謂atomic_flag物件其實就是當前的執行緒。如果當前的執行緒被設定成原子型,那麼等價於上鎖的操作,對變數擁有唯一的修改權。

呼叫clear就是類似於解鎖。

來看乙個例子:

#include #include 

#include

#include

#include

std::atomic_flag

lock = atomic_flag_init; //

初始化原子flag

std::stringstream stream;

x)int

main()

再看乙個例子:

#include #include 

#include

#include

#include

using

namespace

std;

atomic

ready(false

);atomic_flag winner =atomic_flag_init;

void count1m(int

id)int

main()

參考:

c 多執行緒(四)

執行緒間通訊 主線程建立子執行緒必定會為主執行緒分擔一部分工作,這樣不可避免的會在這兩個執行緒之間存在訊息傳遞渠道,因此主線程和子執行緒之間要進行通訊。下面介紹幾種通訊方式 全域性變數 由於同一程序的各個執行緒之間共享該程序的資源,因此,解決執行緒間通訊最簡單的方式是使用全域性變數。對於標準型別的全...

c 多執行緒詳解

自我的部落格 atomic flag thread mutex recursive timed mutex 定時遞迴mutex類 lock類 unique lock 與mutex raii相關,方便執行緒對互斥量上鎖,但提供了更好的上鎖和解鎖控制 其他型別 函式 try lock 嘗試同時對多個互斥...

C 多執行緒系列(四)

parallel類定義了for foreach和invoke的靜態方法。parallel類使用多個任務,因此使用多個執行緒來完成這個作業。parallel.for 方法類似於c 的for迴圈語句,也是多次執行乙個任務。使用parallel.for方法,可以並行執行迭代。迭代的順序沒有定義。paral...