成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux系統(tǒng)編程—互斥量mutex

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

##互斥量mutex

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

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

[[344221]]

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

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

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

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

主要應(yīng)用函數(shù):

  • pthread_mutex_init函數(shù) ​
  • pthread_mutex_destroy函數(shù) ​
  • pthread_mutex_lock函數(shù) ​
  • pthread_mutex_trylock函數(shù) ​
  • pthread_mutex_unlock函數(shù)

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

在Linux環(huán)境下,類型pthread_mutex_t其本質(zhì)是一個結(jié)構(gòu)體。但是為了簡化理解,應(yīng)用時可忽略其實現(xiàn)細節(jié),簡單當成整數(shù)看待。mutex一般以下面方式定義:

  1. pthread_mutex_t mutex; 

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

##pthread_mutex_init函數(shù)

函數(shù)原型:

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

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

參數(shù)介紹:

  • mutex:傳出參數(shù),調(diào)用時應(yīng)傳 &mutex給該函數(shù);

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

  • attr:互斥量屬性。是一個傳入?yún)?shù),通常傳NULL,表示使用默認屬性(即:線程間共享)。

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

  • 靜態(tài)初始化:如果互斥鎖 mutex 是靜態(tài)分配的,即:定義為全局變量,或加了static關(guān)鍵字修飾,可以直接使用宏進行初始化。e.g. pthead_mutex_t muetx = PTHREAD_MUTEX_INITIALIZER;
  • 動態(tài)初始化:如果互斥鎖mutex定義為局部變量,則應(yīng)采用動態(tài)初始化。e.g. pthread_mutex_init(&mutex, NULL)

##pthread_mutex_destroy函數(shù)

函數(shù)原型:

  1. int pthread_mutex_destroy(pthread_mutex_t *mutex); 

函數(shù)作用:銷毀一個互斥鎖

pthread_mutex_lock函數(shù)

函數(shù)原型:

  1. int pthread_mutex_lock(pthread_mutex_t *mutex); 

函數(shù)作用:

  • 對共享資源進行加鎖。可理解為將mutex--(或-1);
  • 如果加鎖不成功,則該線程將阻塞,直到持有該互斥量的其他線程解鎖為止。

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

pthread_mutex_unlock函數(shù)

函數(shù)原型:

  1. int pthread_mutex_trylock(pthread_mutex_t *mutex); 

函數(shù)作用:

  • 對共享資源解鎖。可理解為將mutex ++(或+1);
  • 在解鎖的同時,會將阻塞在該鎖上的所有線程全部喚醒,至于哪個線程先被喚醒,取決于優(yōu)先級、調(diào)度。默認情況下:先阻塞的線程會先被喚醒。

##pthread_mutex_trylock函數(shù)

函數(shù)原型:

  1. int pthread_mutex_trylock(pthread_mutex_t *mutex); 

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

死鎖:

  • 線程試圖對同一個互斥量A加鎖兩次。
  • 線程1擁有A鎖,請求獲得B鎖;線程2擁有B鎖,請求獲得A鎖
  1. #include <stdio.h> 
  2. #include <unistd.h>#include <stdlib.h>#include <pthread.h>pthread_mutex_t mutex;void *tfn(void *arg) 
  3. {    srand(time(NULL)); 
  4.     while(1) { 
  5.         pthread_mutex_lock(&mutex);        printf("hello ");           // 標準輸出為共享資源 
  6.         sleep(rand() % 3);          // 在此時會失去CPU 
  7.         printf("world!\n"); 
  8.         pthread_mutex_unlock(&mutex);        sleep(rand() % 3); 
  9.     }    return NULL; 
  10. }int main(){    pthread_t tid;    int n = 5
  11.     srand(time(NULL)); 
  12.     pthread_mutex_init(&mutex, NULL);    pthread_create(&tid, NULL, tfn, NULL);    while(n--) { 
  13.         pthread_mutex_lock(&mutex); 
  14.         printf("HELLO "); 
  15.         sleep(rand() % 3); 
  16.         printf("WORLD!\n"); 
  17.         pthread_mutex_unlock(&mutex); 
  18.         sleep(rand() % 3); 
  19.     } 
  20.     pthread_cancel(tid); 
  21.     pthread_join(tid, NULL); 
  22.     pthread_mutex_destroy(&mutex); 
  23.     return 0; 

本文授權(quán)轉(zhuǎn)載自公眾號「良許Linux」。良許,世界500強外企Linux開發(fā)工程師,公眾號里分享大量Linux干貨,歡迎關(guān)注!

 

責任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2020-09-25 07:34:40

Linux系統(tǒng)編程信號量

2020-10-10 07:18:14

Linux系統(tǒng)編程管道

2020-10-18 07:13:44

Linux系統(tǒng)編程信號捕捉

2020-10-05 22:01:02

Linux系統(tǒng)編程線程屬性

2020-09-26 21:43:59

Linux系統(tǒng)編程條件變量

2020-09-22 07:35:06

Linux線程進程

2020-09-26 23:09:00

Linux系統(tǒng)編程讀寫鎖

2020-10-05 22:05:10

Linux系統(tǒng)編程時序競態(tài)

2024-06-28 08:45:58

2024-10-14 08:51:52

協(xié)程Go語言

2020-10-08 10:10:51

Linux系統(tǒng)編程信號集

2020-10-09 07:13:11

Linux系統(tǒng)編程mmap

2017-02-28 18:26:09

Linuxinput子系統(tǒng)編程

2023-12-24 12:33:20

互斥鎖Go代碼

2010-03-05 13:34:54

2019-03-15 09:30:09

Linux系統(tǒng)CPU

2021-02-03 20:10:29

Linux信號量shell

2009-07-03 11:57:18

系統(tǒng)編程安全linux

2009-10-23 16:35:44

linux Debia

2010-02-02 13:26:53

Linux內(nèi)核
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 黄色毛片免费看 | 亚洲一区在线播放 | 欧洲毛片 | 在线观看中文字幕亚洲 | 精品综合在线 | 国产亚洲精品久久情网 | 久久久久国产精品 | 欧美精品一区二区三区蜜桃视频 | 久久久久久精 | 成人a免费 | 91极品视频| 亚洲精品久久久久中文字幕二区 | 91精品国产综合久久国产大片 | 午夜视频在线 | 婷婷色网 | 国产精品天堂 | 日韩一区二区黄色片 | 91小视频在线| 国产精品一区二区在线免费观看 | 久久久久久久久久久福利观看 | 久久精品一区 | 久久久久久免费毛片精品 | 亚洲视频免费在线观看 | 久久精品av麻豆的观看方式 | 精品欧美一区二区在线观看 | 日韩在线免费视频 | 欧洲精品码一区二区三区免费看 | 狠狠婷婷综合久久久久久妖精 | 五月婷婷激情网 | 99riav3国产精品视频 | 久久99精品久久久久久国产越南 | 北条麻妃一区二区三区在线视频 | 亚洲一区二区三区在线播放 | 欧美成人免费在线 | 亚洲天堂精品久久 | 在线观看视频91 | 黑人粗黑大躁护士 | 色www精品视频在线观看 | 日韩在线小视频 | 久久精品国产一区二区三区不卡 | 农夫在线精品视频免费观看 |