久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Linux中如何使用互斥量mutex

177次閱讀
沒有評論

共計 2869 個字符,預(yù)計需要花費 8 分鐘才能閱讀完成。

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

## 互斥量 mutex

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

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

互斥量不是為了消除競爭,實際上,資源還是共享的,線程間也還是競爭的,只不過通過這種“鎖”機制就將共享資源的訪問變成互斥操作,也就是說一個線程操作這個資源時,其它線程無法操作它,從而消除與時間有關(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)細(xì)節(jié),簡單當(dāng)成整數(shù)看待。mutex 一般以下面方式定義:

pthread_mutex_t mutex;

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

##pthread_mutex_init 函數(shù)

函數(shù)原型:

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,表示使用默認(rèn)屬性 (即:線程間共享)。

對于互斥量 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ù)原型:

int pthread_mutex_destroy(pthread_mutex_t *mutex);

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

pthread_mutex_lock 函數(shù)

函數(shù)原型:

int pthread_mutex_lock(pthread_mutex_t *mutex);

函數(shù)作用:

對共享資源進行加鎖??衫斫鉃閷?mutex–(或 -1);

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

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

pthread_mutex_unlock 函數(shù)

函數(shù)原型:

int pthread_mutex_trylock(pthread_mutex_t *mutex);

函數(shù)作用:

對共享資源解鎖??衫斫鉃閷?mutex  ++(或 +1);

在解鎖的同時,會將阻塞在該鎖上的所有線程全部喚醒,至于哪個線程先被喚醒,取決于優(yōu)先級、調(diào)度。默認(rèn)情況下:先阻塞的線程會先被喚醒。

##pthread_mutex_trylock 函數(shù)

函數(shù)原型:

int pthread_mutex_trylock(pthread_mutex_t *mutex);

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

死鎖:

線程試圖對同一個互斥量 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   //  標(biāo)準(zhǔn)輸出為共享資源  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”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-25發(fā)表,共計2869字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 平乐县| 宝鸡市| 平湖市| 梓潼县| 大连市| 东兰县| 中山市| 阿拉善右旗| 琼中| 汽车| 东平县| 西盟| 马关县| 睢宁县| 彝良县| 旌德县| 胶州市| 永靖县| 青冈县| 昌宁县| 庆阳市| 交口县| 鄂伦春自治旗| 南陵县| 濉溪县| 图木舒克市| 新郑市| 灌云县| 台州市| 龙江县| 抚顺县| 剑河县| 神农架林区| 南丰县| 锡林郭勒盟| 东乡族自治县| 准格尔旗| 南木林县| 松溪县| 湟源县| 阿坝|