麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

對于CRITICAL_SECTION用法的介紹和理解

2019-11-11 07:38:54
字體:
供稿:網(wǎng)友

      很多人對CRITICAL_SECTION的理解是錯誤的,認(rèn)為CRITICAL_SECTION是鎖定了資源,其實(shí),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實(shí)現(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í)際上是通過限制有且只有一個函數(shù)進(jìn)入CriticalSection變量來實(shí)現(xiàn)代碼段同步的。簡單地說,對于同一個CRITICAL_SECTION,當(dāng)一個線程執(zhí)行了EnterCriticalSection而沒有執(zhí)行 LeaveCriticalSection的時候,其它任何一個線程都無法完全執(zhí)行EnterCriticalSection而不得不處于等待狀態(tài)。

      再次強(qiáng)調(diào)一次,沒有任何資源被“鎖定”,CRITICAL_SECTION這個東東不是針對于資源的,而是針對于不同線程間的代碼段的!我們能夠用它來進(jìn)行所謂資源的“鎖定”,其實(shí)是因為我們在任何訪問共享資源的地方都加入了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其實(shí)并不理會你關(guān)心的具體共享資源,它只按照自己的規(guī)律辦事~


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 92精品国产自产在线 | 国产精品视频一区二区三区综合 | 毛片在哪看 | 日本a级免费 | 操皮视频| 毛片免费视频播放 | 一区二区三区在线播放视频 | 久久久久一本一区二区青青蜜月 | 久草在线高清 | 国产精品久久久久久婷婷天堂 | 亚洲精品一区二区三区在线看 | 狠狠操人人干 | 久久手机在线视频 | 毛片韩国 | 一本色道久久综合狠狠躁篇适合什么人看 | 久草热久 | 欧美日韩一区,二区,三区,久久精品 | 最新中文字幕日本 | 久色乳综合思思在线视频 | 欧美一区二区网站 | 在线无码 | 1区2区3区国产 | 九九精品在线观看视频 | 国产a级久久 | 激情网站免费观看 | 最新亚洲国产 | 性欧美一区二区 | 成人偷拍片视频在线观看 | 亚洲天堂在线电影 | 懂色av懂色aⅴ精彩av | 日本不卡一区二区在线观看 | 斗破苍穹在线观看免费完整观看 | 精品亚洲夜色av98在线观看 | 青草av.久久免费一区 | 精品亚洲国产视频 | av在线免费看网站 | 国产成人精品一区二区仙踪林 | 国产精品久久在线观看 | 一级成人欧美一区在线观看 | 国产一级爱c视频 | 黄色va视频 |