欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

mutex體現(xiàn)的是一種競(jìng)爭(zhēng),我離開(kāi)了,通知你進(jìn)來(lái)。

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

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

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

以上說(shuō)明可能有點(diǎn)抽象,考慮這樣的簡(jiǎn)單場(chǎng)景:通過(guò)偽代碼說(shuō)明。

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

當(dāng)隊(duì)列為空的時(shí)候,A需要不斷的探測(cè)隊(duì)列狀態(tài) :

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

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

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

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


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

可以消除條件發(fā)生和線程睡眠等待條件發(fā)生間的時(shí)間間隙。其他線程在獲得互斥量之前不會(huì)察覺(jué)到這種改變,因?yàn)楸仨氭i定互斥量才能計(jì)算條件。

總而言之,為了避免因條件判斷語(yǔ)句與其后的正文或wait語(yǔ)句之間的間隙而產(chǎn)生的漏判或誤判,所以用一個(gè)mutex來(lái)保證: 對(duì)于某個(gè)cond的包括(判斷,修改)在內(nèi)的任何有關(guān)操作某一時(shí)刻只有一個(gè)線程在訪問(wèn)。也就是說(shuō)條件變量本身就是一個(gè)競(jìng)爭(zhēng)資源,這個(gè)資源的作用是對(duì)其后程序正文的執(zhí)行權(quán),于是用一個(gè)鎖來(lái)保護(hù)。

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

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

以上是關(guān)于效率問(wèn)題,此外互斥鎖還有一個(gè)缺點(diǎn)就是會(huì)造成死鎖。

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

條件變量起到了阻塞和喚醒線程的作用,所以通?;コ怄i要和條件變量配合。

為了解決以上問(wèn)題,條件變量常和互斥鎖一起使用,條件變量通過(guò)允許線程阻塞和等待另一個(gè)線程發(fā)送信號(hào)的方法彌補(bǔ)了互斥鎖的不足。使用時(shí),條件變量被用來(lái)阻塞一個(gè)線程,當(dāng)條件不滿足時(shí),線程往往解開(kāi)相應(yīng)的互斥鎖并等待條件發(fā)生變化。一旦其它的某個(gè)線程改變了條件變量,它將通知相應(yīng)的條件變量喚醒一個(gè)或多個(gè)正被此條件變量阻塞的線程。這些線程將重新鎖定互斥鎖并重新測(cè)試條件是否滿足。

以上就是小編為大家?guī)?lái)的淺談互斥鎖為什么還要和條件變量配合使用全部?jī)?nèi)容了,希望大家多多支持腳本之家~

相關(guān)文章

  • ubuntu20.04虛擬機(jī)無(wú)法上網(wǎng)的問(wèn)題及解決

    ubuntu20.04虛擬機(jī)無(wú)法上網(wǎng)的問(wèn)題及解決

    這篇文章主要介紹了ubuntu20.04虛擬機(jī)無(wú)法上網(wǎng)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Linux環(huán)境下Apache開(kāi)啟https服務(wù)的方法詳解

    Linux環(huán)境下Apache開(kāi)啟https服務(wù)的方法詳解

    這篇文章主要介紹了Linux環(huán)境下Apache開(kāi)啟https服務(wù)的方法,結(jié)合實(shí)例形式分析了阿里云環(huán)境下獲取SSL證書(shū)及Apache服務(wù)器安裝、開(kāi)啟SSL的相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • deepin linux 手動(dòng)升級(jí)內(nèi)核的方法

    deepin linux 手動(dòng)升級(jí)內(nèi)核的方法

    這篇文章主要介紹了deepin linux 手動(dòng)升級(jí)內(nèi)核的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 關(guān)于g++和gcc的相同點(diǎn)和區(qū)別詳解

    關(guān)于g++和gcc的相同點(diǎn)和區(qū)別詳解

    下面小編就為大家?guī)?lái)一篇關(guān)于g++和gcc的相同點(diǎn)和區(qū)別詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • Apache下禁止特定目錄執(zhí)行PHP 提高服務(wù)器安全性

    Apache下禁止特定目錄執(zhí)行PHP 提高服務(wù)器安全性

    之前在博文從PHP安全講DedeCms的安全加固中說(shuō)過(guò)在PHP安全中保護(hù)“可寫(xiě)目錄下的文件不允許被訪問(wèn)到的重要性,還提出了改名文件夾的方式來(lái)保護(hù)該目錄。
    2009-11-11
  • rsync如何實(shí)現(xiàn)斷點(diǎn)續(xù)傳

    rsync如何實(shí)現(xiàn)斷點(diǎn)續(xù)傳

    rsync命令是一種高效的文件傳輸工具,相較于scp命令,它具有支持?jǐn)帱c(diǎn)續(xù)傳和僅拷貝修改過(guò)的文件等優(yōu)勢(shì),大大提高了文件傳輸?shù)男?特別適用于傳輸大文件和定期同步文件夾,通過(guò)參數(shù)配置,rsync能夠?qū)崿F(xiàn)多種高級(jí)功能
    2024-10-10
  • 詳解linux里的backlog參數(shù)

    詳解linux里的backlog參數(shù)

    本文詳細(xì)講解了linux里的backlog參數(shù),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • Linux給普通用戶加超級(jí)用戶權(quán)限的方法

    Linux給普通用戶加超級(jí)用戶權(quán)限的方法

    這篇文章主要介紹了Linux中讓普通用戶擁有超級(jí)用戶的權(quán)限,這樣就不用使用SUDO命令了,需要的朋友要以試一下
    2013-11-11
  • Linux gcc命令的具體使用

    Linux gcc命令的具體使用

    這篇文章主要介紹了Linux gcc命令的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • ubuntu 13.10編譯安裝mono環(huán)境(二)

    ubuntu 13.10編譯安裝mono環(huán)境(二)

    接上篇,上篇僅安裝了Mono本身,并沒(méi)有安裝libgdiplus、gtk-sharp、mod_mono、MonoDevelop 等其他相關(guān)的軟件。 這篇主要是配置安裝libgdiplus。
    2014-07-07

最新評(píng)論