吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳談Linux操作系統(tǒng)編程的互斥量mutex

如意 ? 來源:良許Linux ? 作者:良許 ? 2020-09-28 15:09 ? 次閱讀

##互斥量mutex

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

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

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

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

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

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

主要應用函數(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其本質是一個結構體。但是為了簡化理解,應用時可忽略其實現(xiàn)細節(jié),簡單當成整數(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ù),調用時應傳 &mutex給該函數(shù);

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

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

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

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

動態(tài)初始化:如果互斥鎖mutex定義為局部變量,則應采用動態(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ù)作用:

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

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

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

pthread_mutex_unlock函數(shù)

函數(shù)原型:

int pthread_mutex_trylock(pthread_mutex_t *mutex);

函數(shù)作用:

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

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

##pthread_mutex_trylock函數(shù)

函數(shù)原型:

int pthread_mutex_trylock(pthread_mutex_t *mutex);

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

死鎖:

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

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

詳談Linux操作系統(tǒng)編程的互斥量mutex


責編AJX

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11345

    瀏覽量

    210391
  • 操作系統(tǒng)

    關注

    37

    文章

    6892

    瀏覽量

    123742
  • 編程
    +關注

    關注

    88

    文章

    3637

    瀏覽量

    93983
收藏 人收藏

    評論

    相關推薦

    Linux內核同步機制mutex詳解

    linux內核中,互斥mutex是一種保證CPU串行運行的睡眠鎖機制。和spinlock類似,都是同一個時刻只有一個線程進入臨界資源,不同的是,當無法獲取鎖的時候,spinlock
    發(fā)表于 06-26 16:05 ?1204次閱讀

    Linux高級編程---互斥

    Linux系統(tǒng)里,有很多鎖的應用,包括互斥鎖,文件鎖,讀寫鎖等等,信號其實也應該是鎖的一種。使用鎖的目的是為了達到進程、線程之間的同步作用,使共享資源在同一時間內,只有能有一個進程
    發(fā)表于 01-13 10:07

    Linux操作系統(tǒng)安裝與使用

    嵌入式網(wǎng)絡編程+嵌入式Linux系統(tǒng)一、Linux操作系統(tǒng)安裝與使用(命令)二、Linux開發(fā)工
    發(fā)表于 11-05 08:25

    為何將Linux操作系統(tǒng)劃分為用戶和內核

    linux_C網(wǎng)絡編程概述嵌入式網(wǎng)絡編程==嵌入式Linux_C系統(tǒng)編程(文件、進程、進程間通信、多線程、網(wǎng)絡、大并發(fā)網(wǎng)絡服務器、數(shù)據(jù)庫、s
    發(fā)表于 12-15 08:35

    Linux系統(tǒng)編程重點學習標準I/O庫

    Makefile腳本編寫等知識,嵌入式開發(fā)環(huán)境的搭建。3Linux系統(tǒng)編程重點學習標準I/O庫,Linux多任務編程中的多進程和多線程,以及進程間通信(pipe、FIFO、消息隊列、
    發(fā)表于 12-15 06:45

    Linux操作系統(tǒng)安裝與使用

    嵌入式網(wǎng)絡編程+嵌入式Linux系統(tǒng)Linux操作系統(tǒng)安裝與使用(命令)Linux開發(fā)工具(gc
    發(fā)表于 12-22 07:47

    Linux操作系統(tǒng)安裝與使用方法

    嵌入式網(wǎng)絡編程+嵌入式Linux系統(tǒng)Linux操作系統(tǒng)安裝與使用(命令)Linux開發(fā)工具(gc
    發(fā)表于 12-23 06:57

    什么是Linux系統(tǒng)編程

    什么是Linux系統(tǒng)編程Linux系統(tǒng)編程也叫Linux下的高級編程,是介于應用層和驅動層之間
    發(fā)表于 12-23 07:30

    RT-Thread操作系統(tǒng)互斥的使用方法與場合介紹

    的線程避免了系統(tǒng)資源被任何中間優(yōu)先級的線程搶占。互斥量控制塊在 RT-Thread 中,互斥量控制塊是操作系統(tǒng)用于管理互斥
    發(fā)表于 08-03 11:26

    是否可以為linux操作系統(tǒng)編譯并在基于debian的rasperry操作系統(tǒng)中運行?

    STM32CubeProgrammer 有一個 C++ API,允許創(chuàng)建使用 qt creator 編譯的程序。是否可以為 linux 操作系統(tǒng)編譯并在基于 debian 的 rasperry 操作系統(tǒng)中運行?
    發(fā)表于 12-06 06:01

    linux系統(tǒng)編程_中文版

    linux系統(tǒng)編程_中文版
    發(fā)表于 10-29 10:17 ?0次下載
    <b class='flag-5'>linux</b><b class='flag-5'>系統(tǒng)編程</b>_中文版

    Linux多線程同步互斥Mutex詳解

    嵌入式linux中文站向各位愛好者介紹linux常見同步方式互斥Mutex的使用方法1. 初始化:在
    發(fā)表于 04-02 14:45 ?318次閱讀

    Linux 多線程互斥互斥

    調用立刻返回)。也就是說,加鎖和解鎖這兩個對應的操作,需要在同一個線程中完成。互斥模型#include pthread_mutex_t mute
    發(fā)表于 04-02 14:47 ?280次閱讀

    詳談Linux操作系統(tǒng)編程的條件變量

    條件變量是用來等待線程而不是上鎖的,條件變量通常和互斥鎖一起使用。條件變量之所以要和互斥鎖一起使用,主要是因為互斥鎖的一個明顯的特點就是它只有兩種狀態(tài):鎖定和非鎖定,而條件變量可以通過允許線程阻塞和等待另一個線程發(fā)送信號來彌補
    的頭像 發(fā)表于 09-27 15:23 ?2047次閱讀
    <b class='flag-5'>詳談</b><b class='flag-5'>Linux</b><b class='flag-5'>操作系統(tǒng)編程</b>的條件變量

    為什么我們要掌握Linux系統(tǒng)編程?

    為什么我們要掌握Linux系統(tǒng)編程?
    的頭像 發(fā)表于 05-17 10:00 ?910次閱讀
    百家乐官网大转轮真人视讯| 百家乐官网赌博玩法技巧| 菲律宾赌球| 百家乐打庄技巧| 澳门百家乐官网有赢钱的吗| 永胜博| 大发888东方鸿运| 合乐8百家乐娱乐城| 现金百家乐| 百家乐官网群b28博你| 百家乐官网事电影| 柳江县| 棋牌小游戏下载| 威尼斯人娱乐官方| 百家乐园云鼎娱乐平台| 百家乐技巧娱乐博彩| 澳门百家乐官网游戏下| 破解百家乐官网公式| 正规百家乐官网游戏下载| 杭锦后旗| 蜀都棋牌下载| 大发888赢速通充值| 手机百家乐能兑换现金棋牌游戏| 注册百家乐送彩金 | 大发888黄金版娱乐场| 威尼斯人娱乐城备用地址| 百家乐官网站| 七胜百家乐娱乐城总统网上娱乐城大都会娱乐城赌场 | 百家乐棋牌交友| 百家乐哪家有优惠| 百家乐官网平玩法可以吗| 红9百家乐官网的玩法技巧和规则 高尔夫百家乐官网的玩法技巧和规则 | 百家乐官网评测| 新澳博百家乐官网娱乐城| 博彩百家乐官网软件| 百家乐官网视频台球游戏| 百家乐官网庄闲点数| 漳州市| 365新网址| 大发888体育注册| 大发888游戏怎么玩|