一、引言
前面兩節分別介紹了互斥鎖同步的兩種方法:atomic和critical,本節介紹OpenMP提供的互斥鎖函數。互斥鎖函數類似於Windows、Linux下的mutex。
二、互斥鎖函數
函數簽名 作用
void omp_init_lock(omp_lock *) 初始化互斥器
void omp_destroy_lock(omp_lock *) 銷毀互斥器
void omp_set_lock(omp_lock *) 獲得互斥器
void omp_unset_lock(omp_lock *) 釋放互斥器
bool omp_test_lock(omp_lock *) 試圖獲得互斥器,如果獲得成功返回true,否則返回false
三、樣本
這裡的樣本僅作示範用。
#include <iostream><br />#include <omp.h> // OpenMP編程需要包含的標頭檔</p><p>static omp_lock_t lock;</p><p>int main()<br />{<br /> omp_init_lock(&lock); // 初始化互斥鎖</p><p>#pragma omp parallel for<br /> for (int i = 0; i < 5; ++i)<br /> {<br /> omp_set_lock(&lock); //獲得互斥器<br /> std::cout << omp_get_thread_num() << "+" << std::endl;<br /> std::cout << omp_get_thread_num() << "-" << std::endl;<br /> omp_unset_lock(&lock); //釋放互斥器<br /> }</p><p> omp_destroy_lock(&lock); //銷毀互斥器<br /> return 0;<br />}
上邊的樣本對for迴圈中的所有內容進行加鎖保護,同時只能有一個線程執行for迴圈中的內容。因此列印出來:
可見,線程1或線程2在執行for迴圈內部代碼時不會被打斷。如果刪除代碼中的獲得鎖釋放鎖的代碼,則輸出如下:
互斥鎖函數中只有omp_test_lock函數是帶有傳回值的,該函數可以看作是omp_set_lock的非阻塞版本。
四、小結
介紹了OpenMP提供的互斥鎖函數,通過樣本示範了其使用方法。下面介紹事件同步機制。