亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux中如何使用互斥量mutex

發布時間:2021-10-27 11:51:15 來源:億速云 閱讀:276 作者:小新 欄目:系統運維

小編給大家分享一下Linux中如何使用互斥量mutex,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

##互斥量mutex

前文提到,系統中如果存在資源共享,線程間存在競爭,并且沒有合理的同步機制的話,會出現數據混亂的現象。為了實現同步機制,Linux中提供了多種方式,其中一種方式為互斥鎖mutex(也稱之為互斥量)。

互斥量的具體實現方式為:每個線程在對共享資源操作前都嘗試先加鎖,成功加鎖后才可以對共享資源進行讀寫操作,操作結束后解鎖。

Linux中如何使用互斥量mutex

互斥量不是為了消除競爭,實際上,資源還是共享的,線程間也還是競爭的,只不過通過這種“鎖”機制就將共享資源的訪問變成互斥操作,也就是說一個線程操作這個資源時,其它線程無法操作它,從而消除與時間有關的錯誤。

從互斥量的實現機制我們可以看出,同一時刻,只能有一個線程持有該鎖。如果有同時有多個線程持有該鎖,那就沒有實際意義了。

但是,這種鎖機制不是強制的,互斥鎖實質上是操作系統提供的一把“建議鎖”(又稱“協同鎖”),建議程序中有多線程訪問共享資源的時候使用該機制。

因此,即使有了mutex,其它線程如果不按照這種鎖機制來訪問共享數據的話,依然會造成數據混亂。所以為了避免這種情況,所有訪問該共享資源的線程必須采用相同的鎖機制。

主要應用函數:

  • pthread_mutex_init函數

  • pthread_mutex_destroy函數

  • pthread_mutex_lock函數

  • pthread_mutex_trylock函數

  • pthread_mutex_unlock函數

以上5個函數的返回值都是:成功返回0,失敗返回錯誤號。

在Linux環境下,類型pthread_mutex_t其本質是一個結構體。但是為了簡化理解,應用時可忽略其實現細節,簡單當成整數看待。mutex一般以下面方式定義:

pthread_mutex_t mutex;

變量mutex只有兩種取值1、0。

##pthread_mutex_init函數

函數原型:

int pthread_mutex_init(pthread_mutex_t restrict mutex, const pthread_mutexattr_t restrict attr);

函數作用:初始化一個互斥鎖(互斥量)mutex,初值可視為1;

參數介紹:

  • mutex:傳出參數,調用時應傳 &mutex給該函數;

這里有個關鍵字比較特殊:restrict。它的作用只用于限制指針,告訴編譯器,所有修改該指針指向內存中內容的操作,只能通過本指針完成。不能通過除本指針以外的其他變量或指針修改。比如說,再定義個pthread_mutex_t的指針,將其賦值為mutex的值,想要用它來修改mutex所指向的內存,這是不允許的。

  • attr:互斥量屬性。是一個傳入參數,通常傳NULL,表示使用默認屬性(即:線程間共享)。

對于互斥量mutex的初始化有兩種方式:

  • 靜態初始化:如果互斥鎖 mutex 是靜態分配的,即:定義為全局變量,或加了static關鍵字修飾,可以直接使用宏進行初始化。e.g. pthead_mutex_t  muetx = PTHREAD_MUTEX_INITIALIZER;

  • 動態初始化:如果互斥鎖mutex定義為局部變量,則應采用動態初始化。e.g. pthread_mutex_init(&mutex, NULL)

##pthread_mutex_destroy函數

函數原型:

int pthread_mutex_destroy(pthread_mutex_t *mutex);

函數作用:銷毀一個互斥鎖

pthread_mutex_lock函數

函數原型:

int pthread_mutex_lock(pthread_mutex_t *mutex);

函數作用:

  • 對共享資源進行加鎖。可理解為將mutex--(或-1);

  • 如果加鎖不成功,則該線程將阻塞,直到持有該互斥量的其他線程解鎖為止。

注意:在訪問共享資源前加鎖,訪問結束后立即解鎖。鎖的“粒度”應越小越好。

pthread_mutex_unlock函數

函數原型:

int pthread_mutex_trylock(pthread_mutex_t *mutex);

函數作用:

  • 對共享資源解鎖。可理解為將mutex  ++(或+1);

  • 在解鎖的同時,會將阻塞在該鎖上的所有線程全部喚醒,至于哪個線程先被喚醒,取決于優先級、調度。默認情況下:先阻塞的線程會先被喚醒。

##pthread_mutex_trylock函數

函數原型:

int pthread_mutex_trylock(pthread_mutex_t *mutex);

函數作用:對共享資源嘗試加鎖。它與pthread_mutex_lock函數的區別是,使用lock函數對共享資源進行加鎖時,如果加鎖不成功,則線程就阻塞;而如果使用trylock,則加鎖不成功時不會阻塞當前線程,而是立即返回一個值來描述互斥鎖的狀況。

死鎖:

  • 線程試圖對同一個互斥量A加鎖兩次。

  • 線程1擁有A鎖,請求獲得B鎖;線程2擁有B鎖,請求獲得A鎖

#include <stdio.h> #include <unistd.h>#include <stdlib.h>#include <pthread.h>pthread_mutex_t mutex;void *tfn(void *arg) {    srand(time(NULL));     while(1) {         pthread_mutex_lock(&mutex);        printf("hello ");           // 標準輸出為共享資源         sleep(rand() % 3);          // 在此時會失去CPU         printf("world!\n");         pthread_mutex_unlock(&mutex);        sleep(rand() % 3);     }    return NULL; }int main(){    pthread_t tid;    int n = 5;     srand(time(NULL));     pthread_mutex_init(&mutex, NULL);    pthread_create(&tid, NULL, tfn, NULL);    while(n--) {         pthread_mutex_lock(&mutex);         printf("HELLO ");         sleep(rand() % 3);         printf("WORLD!\n");         pthread_mutex_unlock(&mutex);         sleep(rand() % 3);     }     pthread_cancel(tid);     pthread_join(tid, NULL);     pthread_mutex_destroy(&mutex);     return 0; }

以上是“Linux中如何使用互斥量mutex”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沈丘县| 太湖县| 叶城县| 类乌齐县| 紫云| 沙雅县| 武穴市| 广东省| 同德县| 永丰县| 龙泉市| 杭锦后旗| 泸水县| 武穴市| 乌拉特中旗| 沂南县| 孝感市| 三门县| 塘沽区| 东乌珠穆沁旗| 阳曲县| 罗山县| 丹棱县| 平乐县| 娱乐| 玛多县| 云林县| 沙坪坝区| 宝丰县| 滨海县| 灯塔市| 习水县| 宾阳县| 蛟河市| 玛沁县| 永新县| 从江县| 调兵山市| 贵港市| 收藏| 衡水市|