在任何關於同步機制的討論中,不論是在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)。