1. 引言
在openmp中,執行緒同步機制包括互斥鎖同步機制和事件同步機制。
2. 互斥鎖同步
互斥鎖同步的概念類似於windows中的臨界區(criticalsection)以及windows和linux中的mutex以及vxworks中的semtake和semgive(初始化時訊號量為滿),即對某一塊**操作進行保護,以保證同時只能有乙個執行緒執行該段**。
3. atomic(原子)同步語法
#pragma omp atomic
x < + or * or - or * or / or & or | or << or >> >=expt
(例如,x<<=1; or x*=2;)
或#prgma omp atomic
x++ or x-- or --x or ++x
可以看到atomic的操作僅適用於兩種情況:
1. 自加減操作;
2. x《上述列出的操作符》=expr;
4. 示例
view plain
copy to clipboard
print?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
#include
#include
int main()
std::cout << "after: "
<< sum << std::endl;
return 0;
}
輸出2000,如果將#pragma omp atomic宣告去掉,則結果不確定。
5. critical同步機制
本節介紹互斥鎖機制的使用方法,類似於windows下的criticalsection。
5.1 臨界區宣告方法
#pragma omp critical [(name)] //表示名字可選
//並行程式塊,同時只能有乙個執行緒能訪問該並行程式塊
例如,#pragma omp critial (tst)
a = b + c;
5.2 critical與atomic的區別
臨界區critical可以對某個並行程度塊進行保護,atomic所能保護的僅為一句**。
5.3 critical示例
view plain
copy to clipboard
print?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
#include
#include
int main()
} std::cout << "after: "
<< sum << std::endl;
return 0;
}
執行緒實用解析 (三)執行緒的同步
上一節主要講了建立呼叫有參 多參 函式的執行緒和執行緒池的一些內容,這一節主要講執行緒的同步。多執行緒的出現解決了吞吐量和響應速度的問題,但同時也帶來了資源共享問題,如死鎖和資源爭用。在為單個資源分配多個執行緒可能會導致同步問題。何為執行緒同步呢?所謂同步,是指多個執行緒之間存在先後執行順序的關聯關...
多執行緒小結(三)執行緒同步總結
一般來說,執行緒同步比較讓人糾結的地方在於它是許多執行緒共用一段 的,而且什麼時候誰用誰不用,也基本是不可控制不可預料的,那麼對於它們可能會同時訪問並更改的資料,就需要加鎖了。加鎖就是將一段 變為臨界區 一段在同一時候只被乙個執行緒進入 執行的 加鎖的方式一般有兩種,lock關鍵字 c 提供lock...
linux 多執行緒通訊(三)執行緒的同步
同步 當多個執行緒共享相同的記憶體時,需要每乙個執行緒看到相同的試圖,當乙個執行緒修改變數時,其他執行緒也可以讀取或修改這個變數,就需要執行緒的同步,確保他們不會訪問到無效的變數。互斥量 在變數修改時間多於以乙個儲存器訪問週期的處理器結構中,當儲存器的讀和寫這兩個週期交叉時,這種潛在的不一致性就會出...