為了避免多個執行緒同時修改全域性變數,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...