關(guān)于線程同步的一些總結(jié)(用戶模式/內(nèi)核模式)
自旋鎖同步
- 一般是為了內(nèi)核態(tài)下各個派遣函數(shù)之間做同步作用的。
- 原理是(單CPU)將IRQL從軟件中斷提升到硬件中斷。PASSIVE_LEVEL->DISPATCH_LEVEL。因?yàn)樵贒ISPATCH_LEVEL中是不會出現(xiàn)線程切換的(只有高級別能打斷低級別,而低級別不能打斷高級別)。
- 因?yàn)榉猪搩?nèi)存將導(dǎo)致如果線程切換的時候會引起分頁數(shù)據(jù)交換,數(shù)據(jù)交換是通過引發(fā)頁故障來實(shí)現(xiàn)的,而頁故障是不允許出現(xiàn)在DISPATCH_LEVEL中的,否則將引起系統(tǒng)崩潰(PASSIVE_LEVEL則允許)。驅(qū)動程序的StartIO例程、DPC例程、中斷服務(wù)例程都運(yùn)行在DISPATCH_LEVEL或者更高的IRQL。因此這些例程不能使用分頁內(nèi)存,否則將導(dǎo)致系統(tǒng)崩潰。
- 自旋鎖在不同IRP之間同步的時候,則需要放在DeviceExtension中傳遞。
互鎖
- 類似于number++; //匯編后將不止一條語句,非原子操作number--; //同上因?yàn)檎Z句會變成多句,在線程切換的時候,兩個線程下的該例程將會交織在一起執(zhí)行,導(dǎo)致錯誤。可以:先加鎖來實(shí)現(xiàn)兩句話的同步(按指定順序執(zhí)行,而不受到線程切換的影響)加鎖解鎖可以使用自旋鎖
number++;
解鎖
再加鎖
number--;
解鎖 - 在系統(tǒng)中提供了Interlocked***/ExInterlocked***實(shí)現(xiàn)
信號燈同步
- 線程1關(guān)閉信號燈,以至于使用Wait****的時候,當(dāng)前線程處于暫停狀態(tài)。
- 線程2的作用就是在執(zhí)行結(jié)束后,點(diǎn)亮信號燈(增加計(jì)數(shù)器)。當(dāng)線程切換回來的時候,線程1就因?yàn)橛?jì)數(shù)器不是0而使信號燈處于激活狀態(tài),從而繼續(xù)執(zhí)行線程1。
事件的同步
(不能遞歸獲取互斥體)- 主線程在輔助線程上設(shè)置了事件,如果不使用Wait**等待事件返回,則主線程可能直接執(zhí)行完畢了,而導(dǎo)致輔助線程還在執(zhí)行。
- 使用Wait****可以使主線程等待事件執(zhí)行完成。
互斥體同步
(允許遞歸獲取互斥體(得到互斥體的線程還可以再次獲得這個互斥體,或者說互斥體對于已經(jīng)獲得互斥體的線程不產(chǎn)生“互斥”關(guān)系))- 創(chuàng)建一個互斥體對象,將互斥體對象傳遞給多個線程。
- 在每個線程操作的步驟中,調(diào)用Wait*****,如果互斥體處于激活(內(nèi)部維護(hù)一個計(jì)數(shù)器),則繼續(xù)執(zhí)行后續(xù)代碼,并在調(diào)用結(jié)束后恢復(fù)互斥體Release****,這樣當(dāng)別的線程試圖使用互斥體后面的代碼的時候,因?yàn)榛コ怏w狀態(tài)未激活,則無法繼續(xù)執(zhí)行代碼。
快速互斥體同步
- 與互斥體同步類似,唯一區(qū)別是不允許遞歸獲取互斥體
posted on 2009-12-26 05:53 volnet 閱讀(2109) 評論(2) 編輯 收藏 引用 所屬分類: 知識庫(KnowledgeLibrary) 、C/C++