通常情況下,原子操作是通過互斥(mutual exclusive)的訪問來保證的。
linux下借助posix標準的pthread庫的互斥鎖:
#include
#include
using
namespace
std;
static
long
long total = 0;
pthread_mutex_t m = pthread_mutex_initializer;
void* func(void *)
}int main()
if (pthread_create(&t2, null, &func, null))
pthread_join(t1, null);
pthread_join(t2, null);
cout
<< total << endl; // 9999999900000000
return
0;}
上面**為共享變數建立互斥鎖(m),並在進入臨界區前後進行加鎖(pthread_mutex_lock)和解鎖(pthread_mutex_unlock),從而保證累加的**為原子操作。但這樣對互斥鎖的管理無疑是種負擔,而在c++11中不需要如此麻煩:
#include
#include
#include
using
namespace
std;
atomic_llong total ; // 原子資料型別
除了使用上圖中的已經定義好的原子型別,我們還可以使用atomic類模板,通過std::atomict;
能定義出任意的原子型別。編譯器會保證產生併發情況下行為良好的**,以避免執行緒間對資料t的競爭。
C 11併發程式設計 多執行緒std thread
c 11引入了thread類,大大降低了多執行緒使用的複雜度,原先使用多執行緒只能用系統的api,無法解決跨平台問題,一套 平台移植,對應多執行緒 也必須要修改。現在在c 11中只需使用語言層面的thread可以解決這個問題。所需標頭檔案 thread noexcept 乙個空的std thread...
C 11 多執行緒 併發程式設計總結
建立std thread,一般會繫結乙個底層的執行緒。若該thread還繫結好函式物件,則即刻將該函式執行於thread的底層執行緒。執行緒相關的很多預設是move語義,因為在常識中線程複製是很奇怪的行為。joinable 是否可以阻塞至該thread繫結的底層執行緒執行完畢 倘若該thread沒有...
C 11併發與多執行緒總結
一 執行緒概念 建立及傳參 二 獨佔互斥鎖 mutex,lock guardy與其他mutex 三 unique lock替換lock guardy 四 單例模式 singleton 下的執行緒安全問題 五 window臨界區 六 condition variable條件變數 七 std async...