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

CRITICAL_SECTION用法案例詳解

 更新時(shí)間:2021年08月24日 10:52:28   作者:jota  
這篇文章主要介紹了CRITICAL_SECTION用法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

      很多人對(duì)CRITICAL_SECTION的理解是錯(cuò)誤的,認(rèn)為CRITICAL_SECTION是鎖定了資源,其實(shí),CRITICAL_SECTION是不能夠“鎖定”資源的,它能夠完成的功能,是同步不同線程的代碼段。簡單說,當(dāng)一個(gè)線程執(zhí)行了EnterCritialSection之后,cs里面的信息便被修改,以指明哪一個(gè)線程占用了它。而此時(shí),并沒有任何資源被“鎖定”。不管什么資源,其它線程都還是可以訪問的(當(dāng)然,執(zhí)行的結(jié)果可能是錯(cuò)誤的)。只不過,在這個(gè)線程尚未執(zhí)行LeaveCriticalSection之前,其它線程碰到EnterCritialSection語句的話,就會(huì)處于等待狀態(tài),相當(dāng)于線程被掛起了。 這種情況下,就起到了保護(hù)共享資源的作用。

      也正由于CRITICAL_SECTION是這樣發(fā)揮作用的,所以,必須把每一個(gè)線程中訪問共享資源的語句都放在EnterCritialSection和LeaveCriticalSection之間。這是初學(xué)者很容易忽略的地方。

      當(dāng)然,上面說的都是對(duì)于同一個(gè)CRITICAL_SECTION而言的。 如果用到兩個(gè)CRITICAL_SECTION,比如說:

第一個(gè)線程已經(jīng)執(zhí)行了EnterCriticalSection(&cs)并且還沒有執(zhí)行LeaveCriticalSection(&cs),這時(shí)另一個(gè)線程想要執(zhí)行EnterCriticalSection(&cs2),這種情況是可以的(除非cs2已經(jīng)被第三個(gè)線程搶先占用了)。這也就是多個(gè)CRITICAL_SECTION實(shí)現(xiàn)同步的思想。

       比如說我們定義了一個(gè)共享資源dwTime[100],兩個(gè)線程ThreadFuncA和ThreadFuncB都對(duì)它進(jìn)行讀寫操作。當(dāng)我們想要保證 dwTime[100]的操作完整性,即不希望寫到一半的數(shù)據(jù)被另一個(gè)線程讀取,那么用CRITICAL_SECTION來進(jìn)行線程同步如下:

      第一個(gè)線程函數(shù):

DWORD WINAPI ThreadFuncA(LPVOID lp)
{
            EnterCriticalSection(&cs);
            ...
            //   操作dwTime
            ...
            LeaveCriticalSection(&cs);
            return   0;
}

       寫出這個(gè)函數(shù)之后,很多初學(xué)者都會(huì)錯(cuò)誤地以為,此時(shí)cs對(duì)dwTime進(jìn)行了鎖定操作,dwTime處于cs的保護(hù)之中。一個(gè)“自然而然”的想法就是——cs和dwTime一一對(duì)應(yīng)上了。這么想,就大錯(cuò)特錯(cuò)了。dwTime并沒有和任何東西對(duì)應(yīng),它仍然是任何其它線程都可以訪問的。
如果你像如下的方式來寫第二個(gè)線程,那么就會(huì)有問題:

DWORD   WINAPI   ThreadFuncB(LPVOID   lp)
{
            ...
            //   操作dwTime
            ...
            return   0;
}

      當(dāng)線程ThreadFuncA執(zhí)行了EnterCriticalSection(&cs),并開始操作dwTime[100]的時(shí)候,線程ThreadFuncB可能隨時(shí)醒過來,也開始操作dwTime[100],這樣,dwTime[100]中的數(shù)據(jù)就被破壞了。

      為了讓 CRITICAL_SECTION發(fā)揮作用,我們必須在訪問dwTime的任何一個(gè)地方都加上 EnterCriticalSection(&cs)和LeaveCriticalSection(&cs)語句。所以,必須按照下面的方式來寫第二個(gè)線程函數(shù):

DWORD   WINAPI   ThreadFuncB(LPVOID   lp)
{
            EnterCriticalSection(&cs);
            ...
            //   操作dwTime
            ...
            LeaveCriticalSection(&cs);
            return   0;
}

      這樣,當(dāng)線程ThreadFuncB醒過來時(shí),它遇到的第一個(gè)語句是EnterCriticalSection(&cs),這個(gè)語句將對(duì)cs變量進(jìn)行訪問。如果這個(gè)時(shí)候第一個(gè)線程仍然在操作dwTime[100],cs變量中包含的值將告訴第二個(gè)線程,已有其它線程占用了cs。因此,第二個(gè)線程的 EnterCriticalSection(&cs)語句將不會(huì)返回,而處于掛起等待狀態(tài)。直到第一個(gè)線程執(zhí)行了 LeaveCriticalSection(&cs),第二個(gè)線程的EnterCriticalSection(&cs)語句才會(huì)返回,并且繼續(xù)執(zhí)行下面的操作。

      這個(gè)過程實(shí)際上是通過限制有且只有一個(gè)函數(shù)進(jìn)入CriticalSection變量來實(shí)現(xiàn)代碼段同步的。簡單地說,對(duì)于同一個(gè)CRITICAL_SECTION,當(dāng)一個(gè)線程執(zhí)行了EnterCriticalSection而沒有執(zhí)行 LeaveCriticalSection的時(shí)候,其它任何一個(gè)線程都無法完全執(zhí)行EnterCriticalSection而不得不處于等待狀態(tài)。

      再次強(qiáng)調(diào)一次,沒有任何資源被“鎖定”,CRITICAL_SECTION這個(gè)東東不是針對(duì)于資源的,而是針對(duì)于不同線程間的代碼段的!我們能夠用它來進(jìn)行所謂資源的“鎖定”,其實(shí)是因?yàn)槲覀冊(cè)谌魏卧L問共享資源的地方都加入了EnterCriticalSection和 LeaveCriticalSection語句,使得同一時(shí)間只能夠有一個(gè)線程的代碼段訪問到該共享資源而已(其它想訪問該資源的代如果是兩個(gè)CRITICAL_SECTION,就以此類推。碼段不得不等待)。
如果是兩個(gè)CRITICAL_SECTION,就以此類推。

再舉個(gè)極端的例子,可以幫助你理解CRITICAL_SECTION這個(gè)東東:
第一個(gè)線程函數(shù):

DWORD   WINAPI   ThreadFuncA(LPVOID   lp)
{
            EnterCriticalSection(&cs);
            for(int   i=0;i <1000;i++)
                        Sleep(1000);
            LeaveCriticalSection(&cs);
            return   0;
}

第二個(gè)線程函數(shù):

DWORD   WINAPI   ThreadFuncB(LPVOID   lp)
{
            EnterCriticalSection(&cs);
            index=2;
            LeaveCriticalSection(&cs);
            return   0;
}

      這種情況下,第一個(gè)線程中間總共Sleep了1000秒鐘!它顯然沒有對(duì)任何資源進(jìn)行什么“有意識(shí)”的保護(hù);而第二個(gè)線程是要訪問資源index的,但是由于第一個(gè)線程占用了cs,一直沒有Leave,而導(dǎo)致第二個(gè)線程不得不等上1000秒鐘……
第二個(gè)線程,真是可憐??!
這個(gè)應(yīng)該很說明問題了,你會(huì)看到第二個(gè)線程在1000秒鐘之后開始執(zhí)行index=2這個(gè)語句。也就是說,CRITICAL_SECTION其實(shí)并不理會(huì)你關(guān)心的具體共享資源,它只按照自己的規(guī)律辦事~

到此這篇關(guān)于CRITICAL_SECTION用法案例詳解的文章就介紹到這了,更多相關(guān)CRITICAL_SECTION用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • OpenCV實(shí)現(xiàn)單目尺寸估計(jì)的案例詳解

    OpenCV實(shí)現(xiàn)單目尺寸估計(jì)的案例詳解

    這篇文章主要介紹了通過OpenCV如何實(shí)現(xiàn)單目尺寸估計(jì),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)和工作有一定的參考價(jià)值,感興趣的可以了解一下
    2022-01-01
  • 2~62位任意進(jìn)制轉(zhuǎn)換方法(c++)

    2~62位任意進(jìn)制轉(zhuǎn)換方法(c++)

    下面小編就為大家?guī)硪黄?~62位任意進(jìn)制轉(zhuǎn)換方法(c++)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • C++中的不規(guī)則二維數(shù)組實(shí)現(xiàn)代碼

    C++中的不規(guī)則二維數(shù)組實(shí)現(xiàn)代碼

    本文介紹了一個(gè)在C++中保存不定長二維數(shù)組的數(shù)據(jù)結(jié)構(gòu),在這個(gè)結(jié)構(gòu)中,我們使用了一個(gè)含有指針和數(shù)組長度的結(jié)構(gòu)體,用這樣的一個(gè)結(jié)構(gòu)體構(gòu)造一個(gè)結(jié)構(gòu)體數(shù)組,用于存儲(chǔ)每一個(gè)不定長的數(shù)組,感興趣的朋友一起看看吧
    2024-03-03
  • 完全掌握C++編程中構(gòu)造函數(shù)使用的超級(jí)學(xué)習(xí)教程

    完全掌握C++編程中構(gòu)造函數(shù)使用的超級(jí)學(xué)習(xí)教程

    這篇文章主要介紹了C++中的構(gòu)造函數(shù),包括C++11標(biāo)準(zhǔn)中的新特性的介紹,十分推薦!需要的朋友可以參考下
    2016-01-01
  • Qt利用QScroller實(shí)現(xiàn)home界面滑動(dòng)效果

    Qt利用QScroller實(shí)現(xiàn)home界面滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Qt如何利用QScroller實(shí)現(xiàn)home界面滑動(dòng)效果,文中的實(shí)現(xiàn)過程講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-11-11
  • C++中字符串與整型及浮點(diǎn)型轉(zhuǎn)換全攻略

    C++中字符串與整型及浮點(diǎn)型轉(zhuǎn)換全攻略

    C++算法刷題等過程中經(jīng)常會(huì)遇到字符串與數(shù)字類型的轉(zhuǎn)換,在這其中雖然樸素的算法有不少,但是對(duì)于double等類型還是可以說遇到一些麻煩,所以今天就來說說使用C++標(biāo)準(zhǔn)庫中的函數(shù)實(shí)現(xiàn)這些功能。感興趣的小伙伴一起參與閱讀吧
    2021-09-09
  • C++實(shí)現(xiàn)文件逐行讀取與字符匹配的示例詳解

    C++實(shí)現(xiàn)文件逐行讀取與字符匹配的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何溧陽C++實(shí)現(xiàn)文件逐行讀取與字符匹配的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-03-03
  • C++17之std::any的具體使用

    C++17之std::any的具體使用

    本文主要介紹了C++17之std::any的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++各種輸出數(shù)據(jù)類型詳解

    C++各種輸出數(shù)據(jù)類型詳解

    這篇文章主要介紹了C++各種輸出數(shù)據(jù)類型,在C++中,可以使用cout對(duì)象和插入運(yùn)算符<<輸出各種數(shù)據(jù)類型,包括整數(shù)類型、浮點(diǎn)數(shù)類型、字符類型、字符串類型和布爾類型,需要的朋友可以參考下
    2023-06-06
  • C++中rapidjson組裝map和數(shù)組array的代碼示例

    C++中rapidjson組裝map和數(shù)組array的代碼示例

    今天小編就為大家分享一篇關(guān)于C++中rapidjson組裝map和數(shù)組array的代碼示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04

最新評(píng)論