OpenMP(三) 執行緒同步

2021-06-16 19:00:07 字數 1610 閱讀 4104

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 多執行緒通訊(三)執行緒的同步

同步 當多個執行緒共享相同的記憶體時,需要每乙個執行緒看到相同的試圖,當乙個執行緒修改變數時,其他執行緒也可以讀取或修改這個變數,就需要執行緒的同步,確保他們不會訪問到無效的變數。互斥量 在變數修改時間多於以乙個儲存器訪問週期的處理器結構中,當儲存器的讀和寫這兩個週期交叉時,這種潛在的不一致性就會出...