亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

對于CRITICAL_SECTION用法的介紹和理解

2019-11-11 07:38:54
字體:
來源:轉載
供稿:網友

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

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

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

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

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

DWord WINAPI ThreadFuncA(LPVOID lp){            EnterCriticalSection(&cs);            ...            //   操作dwTime            ...            LeaveCriticalSection(&cs);            return   0;}       寫出這個函數之后,很多初學者都會錯誤地以為,此時cs對dwTime進行了鎖定操作,dwTime處于cs的保護之中。一個“自然而然”的想法就是——cs和dwTime一一對應上了。這么想,就大錯特錯了。dwTime并沒有和任何東西對應,它仍然是任何其它線程都可以訪問的。如果你像如下的方式來寫第二個線程,那么就會有問題:

DWORD   WINAPI   ThreadFuncB(LPVOID   lp){            ...            //   操作dwTime            ...            return   0;}      當線程ThreadFuncA執行了EnterCriticalSection(&cs),并開始操作dwTime[100]的時候,線程ThreadFuncB可能隨時醒過來,也開始操作dwTime[100],這樣,dwTime[100]中的數據就被破壞了。

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

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

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

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

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

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

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

 

第二個線程函數:

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国语精品自产拍在线观看| 日韩亚洲精品视频| 欧美极品少妇全裸体| 中文字幕亚洲一区| 国产日韩欧美自拍| 国产日韩精品综合网站| 人九九综合九九宗合| 综合136福利视频在线| 亚洲情综合五月天| 91久久久久久久久久久| 久久国产精品久久久久| 欧美一级在线播放| 亚洲国产欧美精品| 深夜福利日韩在线看| 97国产精品免费视频| 日韩精品视频在线观看网址| 日本久久久久亚洲中字幕| 欧美俄罗斯性视频| 国产精品h在线观看| 欧美色videos| 黑人巨大精品欧美一区二区| 亚洲专区中文字幕| 激情成人中文字幕| 欧美精品videos性欧美| 91在线视频免费| 97精品欧美一区二区三区| 91精品国产91久久久久久久久| 九九久久国产精品| 欧美日韩激情小视频| 亚洲福利视频久久| 51久久精品夜色国产麻豆| 亚洲精品小视频在线观看| 久久久亚洲网站| 国产成人精品在线视频| 成人免费观看网址| 国产精品久久网| 国产91精品高潮白浆喷水| 97久久超碰福利国产精品…| 亚洲高清久久久久久| 91精品成人久久| 91精品久久久久久久久| 亚洲激情国产精品| 欧美综合一区第一页| 亚洲精品久久久久中文字幕欢迎你| 亚洲精品美女视频| 日韩亚洲国产中文字幕| 亚洲欧美制服丝袜| 亚洲视频在线免费观看| 亚洲一区二区三区xxx视频| 91久久精品国产91性色| 欧美疯狂做受xxxx高潮| 成人av在线网址| 亚洲日韩第一页| 精品久久久久久久久久久| 欧美一级成年大片在线观看| 日韩激情第一页| 精品久久久中文| 色综合久久久888| 日韩精品福利网站| 色婷婷成人综合| 亚洲最大成人在线| 国产午夜精品全部视频播放| 亚洲伊人一本大道中文字幕| 国产在线视频91| 亚洲成人网av| 国产精品久久久久久久天堂| 51精品国产黑色丝袜高跟鞋| 日韩有码视频在线| 久久久久久久久久久免费精品| 久久色免费在线视频| 国产91在线高潮白浆在线观看| 欧美在线视频免费播放| 精品国产一区二区在线| 国产精品美乳一区二区免费| 亚洲电影免费观看高清完整版在线| 午夜精品久久久久久久99热浪潮| 欧美激情精品久久久久久变态| 久久精品国产欧美激情| 日韩美女免费线视频| 久久久久久国产三级电影| 欧美日韩亚洲一区二区| 久久久视频免费观看| 亚洲三级黄色在线观看| 国产一区视频在线播放| 日本亚洲精品在线观看| 91精品国产91久久久久久最新| 久久视频在线视频| 色偷偷av亚洲男人的天堂| 欧美久久精品午夜青青大伊人| 庆余年2免费日韩剧观看大牛| 亚洲男人天堂网站| 日韩国产精品一区| 日韩精品免费在线视频观看| 欧日韩在线观看| 国产自产女人91一区在线观看| 福利微拍一区二区| 日本高清不卡在线| 成人免费在线视频网址| 亚洲毛片在线观看| 日韩欧美视频一区二区三区| 亚洲护士老师的毛茸茸最新章节| 成人网址在线观看| 欧美精品在线第一页| 国产久一一精品| 日本精品视频在线播放| 在线视频欧美日韩精品| 97精品视频在线观看| 欧美日韩国产在线播放| 久久综合网hezyo| 亚洲最新av网址| 日韩乱码在线视频| 成人精品在线视频| 久久全国免费视频| 国内成人精品视频| 久久99精品久久久久久青青91| 日韩精品高清视频| 日韩在线免费av| 久久夜色精品国产亚洲aⅴ| 97在线免费观看视频| 欧美日本啪啪无遮挡网站| 亚洲精品国产品国语在线| 午夜精品国产精品大乳美女| 欧美性极品xxxx娇小| 国产精品狼人色视频一区| 午夜精品国产精品大乳美女| 日韩成人网免费视频| 欧美二区乱c黑人| 欧美性xxxxxxx| 色综合视频一区中文字幕| 亚洲国产精品va在线| 91亚洲午夜在线| 亚洲久久久久久久久久久| 国产精品露脸av在线| 国产精品黄页免费高清在线观看| 97精品一区二区三区| 中文字幕精品—区二区| 国产精品色悠悠| 色综合久综合久久综合久鬼88| 欧美日韩国产在线播放| 黑人巨大精品欧美一区免费视频| 久久国产精品电影| 国产精品视频男人的天堂| 国产精品极品尤物在线观看| 中文字幕欧美亚洲| 欧美亚州一区二区三区| 成人免费直播live| 久青草国产97香蕉在线视频| 国产精品av免费在线观看| 精品毛片网大全| 成人精品视频99在线观看免费| 久久男人av资源网站| 91中文字幕一区| 九九视频直播综合网| 九九久久久久99精品| 久久99精品视频一区97| 欧美大肥婆大肥bbbbb| 色综合91久久精品中文字幕| 国产亚洲一区二区在线| 中国日韩欧美久久久久久久久| 欧美极品第一页| 色综合老司机第九色激情| 亚洲第一色中文字幕| 久久久久久国产精品| 欧美老女人性视频|