Windows 临界区(CRITICAL_SECTION)的使用
由于需要在多線程中并發(fā)操作臨界數(shù)據(jù),為了保證臨界數(shù)據(jù)操作的完整性,Linux下使用鎖(Linux下鎖可以看我的這篇博客Linux 互斥鎖 遞歸鎖 自旋鎖 讀寫鎖),而在Windows下,使用的是臨界區(qū)。
每個(gè)線程中訪問臨界資源的那段程序稱為臨界區(qū)(Critical Section)(臨界資源是一次僅允許一個(gè)線程使用的共享資源)。每次只準(zhǔn)許一個(gè)線程進(jìn)入臨界區(qū),進(jìn)入后不允許其他線程進(jìn)入。不論是硬件臨界資源,還是軟件臨界資源,多個(gè)線程必須互斥地對它進(jìn)行訪問。在說臨界區(qū)之前,我們先講下同步和互斥,以理解為什么需要臨界區(qū)。
?
同步和互斥機(jī)制
- 基本概念
同步和互斥的概念有時(shí)候很容易混淆,可以簡單地認(rèn)為同步是更加宏觀角度的一種說法,互斥是沖突解決的細(xì)節(jié)方法。所謂同步就是調(diào)度者讓任務(wù)按照約定的合理的順序進(jìn)行,但是當(dāng)任務(wù)之間出現(xiàn)資源競爭,也就是競態(tài)沖突時(shí),使用互斥的規(guī)則強(qiáng)制約束允許數(shù)量的任務(wù)占用資源,從而解決各個(gè)競爭狀態(tài),實(shí)現(xiàn)任務(wù)的合理運(yùn)行。
同步和互斥密不可分,有資料說互斥是一種特殊的同步,對此我不太理解,不過實(shí)際中想明白細(xì)節(jié)就行,文字游戲沒有意義。
簡單來說:
- 同步與互斥機(jī)制是用于控制多個(gè)任務(wù)對某些特定資源的訪問策略
- 同步是控制多個(gè)任務(wù)按照一定的規(guī)則或順序訪問某些共享資源
- 互斥是控制某些共享資源在任意時(shí)刻只能允許規(guī)定數(shù)量的任務(wù)訪問
- 角色分類
整個(gè)協(xié)調(diào)流程涉及的角色本質(zhì)上只有三類:
- 不可獨(dú)占的共享資源
- 多個(gè)使用者
- 調(diào)度者
調(diào)度者需要為多個(gè)運(yùn)行任務(wù)制定訪問使用規(guī)則來實(shí)現(xiàn)穩(wěn)定運(yùn)行,這個(gè)調(diào)度者可以是內(nèi)核、可以是應(yīng)用程序,具體場景具體分析。
- 重要術(shù)語
要很好地理解同步和互斥,就必須得搞清楚幾個(gè)重要術(shù)語:
- 競爭冒險(xiǎn)(race hazard)或競態(tài)條件(race condition)
最早聽說這個(gè)術(shù)語是在模電數(shù)電的課程上,門電路出現(xiàn)競態(tài)條件造成錯(cuò)誤的結(jié)果,在計(jì)算機(jī)里面就是多個(gè)使用者同時(shí)操作共享的變量造成結(jié)果的不確定。
- 臨界區(qū)
臨界區(qū)域critical section是指多使用者可能同時(shí)共同操作的那部分代碼,比如自加自減操作,多個(gè)線程處理時(shí)就需要對自加自減進(jìn)行保護(hù),這段代碼就是臨界區(qū)域。
?
?臨界區(qū)(Critical Section)
Linux下有遞歸鎖,遞歸鎖是同一個(gè)線程在不解鎖的情況下,可以多次獲取鎖定同一個(gè)遞歸鎖,而且不會產(chǎn)生死鎖。windows下的互斥量和臨界區(qū)(關(guān)鍵段)默認(rèn)支持遞歸鎖。
- void InitializeCriticalSection(? LPCRITICAL_SECTION?lpCriticalSection);初始化一個(gè)臨界區(qū)對象
-
void DeleteCriticalSection(_Inout_ LPCRITICAL_SECTION lpCriticalSection);刪除臨界區(qū)對象釋放由該對象使用的所有系統(tǒng)資源
-
void EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection );//進(jìn)入臨界區(qū),相當(dāng)于Linux下lock
-
void LeaveCriticalSection( LPCRITICAL_SECTION lpCriticalSection );//刪除臨界區(qū),相當(dāng)于Linux下unlock
使用臨界區(qū)加1次鎖和2次鎖,均可以正確的輸出1~10000。
?
總結(jié)
以上是生活随笔為你收集整理的Windows 临界区(CRITICAL_SECTION)的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: %02x与%2x 区别
- 下一篇: VMware彻底删除、扫描添加导入,已安