一起來學OpenMP(8)——線程同步之互斥鎖函數

來源:互聯網
上載者:User

 一、引言

前面兩節分別介紹了互斥鎖同步的兩種方法: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提供的互斥鎖函數,通過樣本示範了其使用方法。下面介紹事件同步機制。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.