最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談互斥鎖為什么還要和條件變量配合使用

 更新時間:2017年01月12日 08:44:19   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\談互斥鎖為什么還要和條件變量配合使用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

mutex體現(xiàn)的是一種競爭,我離開了,通知你進來。

cond體現(xiàn)的是一種協(xié)作,我準備好了,通知你開始吧。

互斥鎖一個明顯的缺點是它只有兩種狀態(tài):鎖定和非鎖定。而條件變量通過允許線程阻塞和等待另一個線程發(fā)送信號的方法彌補了互斥鎖的不足,它常和互斥鎖一起配合使用。使用時,條件變量被用來阻塞一個線程,當條件不滿足時,線程往往解開相應的互斥鎖并等待條件發(fā)生變化。一旦其他的某個線程改變了條件變量,他將通知相應的條件變量喚醒一個或多個正被此條件變量阻塞的線程。這些線程將重新鎖定互斥鎖并重新測試條件是否滿足。一般說來,條件變量被用來進行線程間的同步。

兩個線程操作同一臨界區(qū)時,通過互斥鎖保護,若A線程已經加鎖,B線程再加鎖時候會被阻塞,直到A釋放鎖,B再獲得鎖運行,進程B必須不停的主動獲得鎖、檢查條件、釋放鎖、再獲得鎖、再檢查、再釋放,一直到滿足運行的條件的時候才可以(而此過程中其他線程一直在等待該線程的結束),這種方式是比較消耗系統(tǒng)的資源的。而條件變量同樣是阻塞,還需要通知才能喚醒,線程被喚醒后,它將重新檢查判斷條件是否滿足,如果還不滿足,該線程就休眠了,應該仍阻塞在這里,等待條件滿足后被喚醒,節(jié)省了線程不斷運行浪費的資源。這個過程一般用while語句實現(xiàn)。當線程B發(fā)現(xiàn)被鎖定的變量不滿足條件時會自動的釋放鎖并把自身置于等待狀態(tài),讓出CPU的控制權給其它線程。其它線程 此時就有機會去進行操作,當修改完成后再通知那些由于條件不滿足而陷入等待狀態(tài)的線程。這是一種通知模型的同步方式,大大的節(jié)省了CPU的計算資源,減少了線程之間的競爭,而且提高了線程之間的系統(tǒng)工作的效率。這種同步方式就是條件變量。                                       

以上說明可能有點抽象,考慮這樣的簡單場景:通過偽代碼說明。

A線程從隊列中取元素,B線程往隊列中存放元素。不考慮免鎖的實現(xiàn)。需要一個mutex用來保護隊列的一致性,避免兩個線程同時操作隊列破壞數(shù)據(jù)結構。

當隊列為空的時候,A需要不斷的探測隊列狀態(tài) :

while(1)
{ 
if(隊列為空)
休眠10s
else
    {
        加鎖
        取元素
        解鎖
     }
}

這就有一個問題,可能在剛進入休眠時,B放入元素了,但仍然需要休眠完整個10s的時間。造成不必要的延遲。當然如果不sleep,也可以,但會造成不必要的CPU開銷。使用基于條件變量的事件通知喚醒機制,就可以避免這些問題。

一旦B放入元素完成后就執(zhí)行pthread_cond_signal(),當前阻塞的線程就會立即被喚醒開始干活兒。

while(1) {
    pthread_mutex_lock();
    pthread_cond_wait();
    取元素;
    pthread_mutex_unlock();
}


條件變量都用互斥鎖進行保護,條件變量狀態(tài)的改變都應該先鎖住互斥鎖,pthread_cond_wait()需要傳入一個已經加鎖的互斥鎖,該函數(shù)把調用線程加入等待條件的調用列表中,然后釋放互斥鎖,在條件滿足從而離開pthread_cond_wait()時,mutex將被重新加鎖,這兩個函數(shù)是原子操作。

可以消除條件發(fā)生和線程睡眠等待條件發(fā)生間的時間間隙。其他線程在獲得互斥量之前不會察覺到這種改變,因為必須鎖定互斥量才能計算條件。

總而言之,為了避免因條件判斷語句與其后的正文或wait語句之間的間隙而產生的漏判或誤判,所以用一個mutex來保證: 對于某個cond的包括(判斷,修改)在內的任何有關操作某一時刻只有一個線程在訪問。也就是說條件變量本身就是一個競爭資源,這個資源的作用是對其后程序正文的執(zhí)行權,于是用一個鎖來保護。

這樣就關閉了條件檢查和線程進入休眠狀態(tài)等待條件改變這兩個操作之間的時間通道,這樣線程就不會有任何變化。

感覺可以總結為:條件變量用于某個線程需要在某種條件成立時才去保護它將要操作的臨界區(qū),這種情況從而避免了線程不斷輪詢檢查該條件是否成立而降低效率的情況,這是實現(xiàn)了效率提高。。。在條件滿足時,自動退出阻塞,再加鎖進行操作。

以上是關于效率問題,此外互斥鎖還有一個缺點就是會造成死鎖。

例如線程A和線程B都需要獨占使用2個資源,但是他們都分別先占據(jù)了一個資源,然后又相互等待另外一個資源的釋放,這樣就形成了一個死鎖。

條件變量起到了阻塞和喚醒線程的作用,所以通常互斥鎖要和條件變量配合。

為了解決以上問題,條件變量常和互斥鎖一起使用,條件變量通過允許線程阻塞和等待另一個線程發(fā)送信號的方法彌補了互斥鎖的不足。使用時,條件變量被用來阻塞一個線程,當條件不滿足時,線程往往解開相應的互斥鎖并等待條件發(fā)生變化。一旦其它的某個線程改變了條件變量,它將通知相應的條件變量喚醒一個或多個正被此條件變量阻塞的線程。這些線程將重新鎖定互斥鎖并重新測試條件是否滿足。

以上就是小編為大家?guī)淼臏\談互斥鎖為什么還要和條件變量配合使用全部內容了,希望大家多多支持腳本之家~

相關文章

  • Linux中Netcat命令整理

    Linux中Netcat命令整理

    本篇文章給大家整理了Linux中Netcat的命令以及命令的功能詳解,一起學習下。
    2018-02-02
  • Linux服務器上使用docker的簡單教程

    Linux服務器上使用docker的簡單教程

    這篇文章主要為大家詳細介紹了Linux服務器上使用docker的簡單教程,文中的示例代碼簡潔易懂,有需要的小伙伴可以跟隨小編一起學習一下
    2025-03-03
  • 詳解Supervisor安裝與配置(Linux/Unix進程管理工具)

    詳解Supervisor安裝與配置(Linux/Unix進程管理工具)

    這篇文章主要介紹了詳解Supervisor安裝與配置(Linux/Unix進程管理工具),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Linux系統(tǒng)修改環(huán)境變量的常用方法

    Linux系統(tǒng)修改環(huán)境變量的常用方法

    這篇文章主要給大家介紹了Linux系統(tǒng)修改環(huán)境變量的常用方法,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • Xshell連接不上虛擬機的解決辦法匯總

    Xshell連接不上虛擬機的解決辦法匯總

    本文主要介紹了Xshell連接不上虛擬機的解決辦法匯總,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Linux磁盤空間不足的有效解決方法總結

    Linux磁盤空間不足的有效解決方法總結

    在使用 MySQL 數(shù)據(jù)庫時,開發(fā)者和系統(tǒng)管理員可能會遇到各種錯誤,其中之一便是 sqlalchemy.exc.InternalError,這個錯誤提示表明,系統(tǒng)在嘗試向 /tmp 目錄寫入文件時,發(fā)現(xiàn)沒有足夠的磁盤空間,所以本文給大家總結Linux磁盤空間不足的有效解決方法,需要的朋友可以參考下
    2024-11-11
  • Linux部署nginx訪問文件403問題及解決

    Linux部署nginx訪問文件403問題及解決

    在Linux服務器上通過Nginx部署時遇到403錯誤,原因是文件權限不足,解決方案一:使用`chmod -R 777`賦予Web目錄讀寫權限;解決方案二:調整`umask`值為0022,確保新創(chuàng)建的文件和目錄具有正確的權限
    2024-11-11
  • VPS CentOS-6 下 LNMP HTTP web服務器的搭建步驟

    VPS CentOS-6 下 LNMP HTTP web服務器的搭建步驟

    雖然現(xiàn)在很多朋友比較喜歡使用軍哥的lnmp一鍵安裝包,但手工配置方法也要會,否則容易技術退步
    2014-06-06
  • 解決nginx/apache靜態(tài)資源跨域訪問問題詳解

    解決nginx/apache靜態(tài)資源跨域訪問問題詳解

    有時為了優(yōu)化網(wǎng)站訪問速度,會給一些靜態(tài)資源配置cdn加速,但是有時候會出現(xiàn)跨域訪問的問題,在nginx和apache服務中可進行如下配置
    2018-10-10
  • 詳解Linux命令與文件查找

    詳解Linux命令與文件查找

    這篇文章主要介紹了Linux命令與文件查找,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04

最新評論

新田县| 宜春市| 博湖县| 永康市| 宜春市| 杭锦后旗| 茌平县| 若羌县| 南宁市| 珠海市| 铜川市| 华阴市| 天气| 兰溪市| 山丹县| 桐城市| 赫章县| 扎囊县| 疏附县| 兴山县| 登封市| 荣昌县| 黔江区| 崇州市| 湟源县| 新安县| 津市市| 会东县| 余庆县| 武汉市| 苏尼特左旗| 叙永县| 长沙县| 凌源市| 文安县| 合作市| 汝阳县| 长子县| 平安县| 鄂尔多斯市| 冷水江市|