Win32多線程之最小鎖定時間

在任何關於同步機制的討論中,不論是在Win32或Unix或其他操作系統,你一定會一再地聽到這樣一條規則:

 不要長時間鎖住一份資源


   如果你一直讓資源被鎖定,你就會阻止其他線程的執行,並把整個程序帶到一個完全停止的狀態。以critical section 來說,當某個線程進入critical section時,該項資源即被鎖定。

   我們很難定義所謂”長時間“是多少,如果你在網絡上進行操作,並且是在一個撥號網絡上,長時間可能是指數分鐘,如果你所處理的是應用程序的一項關鍵性資源,長時間可能是指數個毫秒。

   我能夠給你的最牢靠而立即的警告就是,千萬不要在一個critical section中調用Sleep()或任何Wait...() API函數。

   當你以一個同步機制保護一份資源時,有一點必須常記在心,那就是:這項資源被使用的頻率如何?線程必須多快釋放這份資源,才能夠確保整個程序的運作很平順?

   某些人會關心這樣的問題:如果我再也不釋放資源(或不離開critical section,或者不釋放mutex......等等),會怎樣?答案是:不會怎樣!

   操作系統不會當掉,用戶不會獲得任何錯誤信息,最壞的情況是,當主線程(一個GUI線程)需要使用這被鎖定的資源時,程序會掛在那兒,動也不動。

   Critical section的一個缺點就是,沒有辦法獲知進入critical section中的那個線程是生是死。從另一個角度看,由於critical section不是核心對象,如果進入critical section的那個線程結束了或者當掉了,而沒有調用LeaveCriticalSection()的話,系統沒有辦法將該critical section清除。如果你需要那樣的機能,你應該使用mutex(後面講介紹mutex)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章