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

CRITICAL_SECTION用法案例詳解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • C++ XML庫用法詳解

    C++ XML庫用法詳解

    TinyXML-2是C++中一個輕量級、易于使用的XML解析庫,支持XML的讀取和寫入,內(nèi)存占用小,適合嵌入式系統(tǒng),本文給大家介紹C++ XML庫用法,感興趣的朋友一起看看吧
    2025-03-03
  • C語言實現(xiàn)中國象棋

    C語言實現(xiàn)中國象棋

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)中國象棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++實現(xiàn)團(tuán)購訂單管理系統(tǒng)

    C++實現(xiàn)團(tuán)購訂單管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實現(xiàn)團(tuán)購訂單管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-12-12
  • C++小游戲tankwar之界面繪制的詳細(xì)過程

    C++小游戲tankwar之界面繪制的詳細(xì)過程

    最近沒有項目做,空閑了下來,于是寫了個c++小游戲來打發(fā)時間,下面通過本文基于圖文并茂的形式給大家介紹C++小游戲tankwar之界面繪制的詳細(xì)過程,感興趣的朋友一起看看吧
    2021-05-05
  • C語言中單引號和雙引號用法詳解

    C語言中單引號和雙引號用法詳解

    C語言中,單引號用于表示單個字符常量,而雙引號用于表示字符串,單引號中的字符是int類型,雙引號中的字符串是以null字符結(jié)尾的字符數(shù)組,本文介紹C語言中單引號和雙引號用法,感興趣的朋友一起看看吧
    2025-01-01
  • C語言一維數(shù)組初步學(xué)習(xí)筆記

    C語言一維數(shù)組初步學(xué)習(xí)筆記

    這篇文章主要介紹了C語言一維數(shù)組初步學(xué)習(xí)筆記,包括指針訪問數(shù)組等重要知識點,需要的朋友可以參考下
    2016-05-05
  • C語言入門學(xué)習(xí)之fgets()函數(shù)和fputs()函數(shù)

    C語言入門學(xué)習(xí)之fgets()函數(shù)和fputs()函數(shù)

    fgetc() 和 fputc() 函數(shù)每次只能讀寫一個字符,速度較慢,實際開發(fā)中往往是每次讀寫一個字符串或者一個數(shù)據(jù)塊,這樣能明顯提高效率,這篇文章主要給大家介紹了關(guān)于C語言入門學(xué)習(xí)之fgets()函數(shù)和fputs()函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • 解析OpenSSL1.1.1?centos7安裝編譯aes的c++調(diào)用

    解析OpenSSL1.1.1?centos7安裝編譯aes的c++調(diào)用

    這篇文章主要介紹了OpenSSL1.1.1?centos7安裝編譯aes的c++調(diào)用,實現(xiàn)方法也很簡單,主要是在該文檔內(nèi)加入openssl的lib路徑,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • VC編程控件類HTControl之CHTGDIManager GDI資源管理類用法解析

    VC編程控件類HTControl之CHTGDIManager GDI資源管理類用法解析

    這篇文章主要介紹了VC編程控件類HTControl之CHTGDIManager GDI資源管理類用法解析,需要的朋友可以參考下
    2014-08-08
  • 大數(shù)據(jù)情況下桶排序算法的運用與C++代碼實現(xiàn)示例

    大數(shù)據(jù)情況下桶排序算法的運用與C++代碼實現(xiàn)示例

    在排序元素很多的情況下,其實桶排序的性能并不是太高,這里我們配合單鏈表的直接插入排序,來看下一大數(shù)據(jù)情況下桶排序算法的運用與C++代碼實現(xiàn)示例:
    2016-07-07

最新評論

花莲县| 新河县| 和平区| 丰台区| 富民县| 且末县| 陇南市| 建平县| 田东县| 曲麻莱县| 扶余县| 蓬莱市| 信阳市| 文登市| 莲花县| 安吉县| 正镶白旗| 清徐县| 平罗县| 昂仁县| 牟定县| 金堂县| 常德市| 陈巴尔虎旗| 古浪县| 乌兰县| 文昌市| 大冶市| 平泉县| 博客| 蒙山县| 政和县| 井研县| 南靖县| 宁陕县| 英德市| 盘锦市| 深圳市| 克东县| 璧山县| 新昌县|