Mutex是核心對象,能夠被WaitForSingleObject()函數請求。而CriticalSection不是核心對象。不能被WaitForSingleObject()函數請求。
Win32 的 Mutex 用途和 critical section 非常類似,但是它犧牲速度以增加彈性。或許你已經猜到了, mutex 是 MU Tual EXclusion 的縮寫。一個時間内隻能夠有一個線程擁有 mu tex,就好像同一時間内隻能夠有一個線程進入同一個 critical section 一樣。
雖然 mu tex 和 critical section 做相同的事情,但是它們的運作還是有差别的:
1.鎖住一個未被擁有的 mu tex,比鎖住一個未被擁有的 critical section,需要花費幾乎 100 倍的時間。因為 critical section 不需要進入作業系統核心,直接在“ user m ode”就可以進行操作。(代碼在使用者态,而Mutex是核心對象,在核心态,是以,在代碼中使用Mutex,會有一個使用者态到核心态的切換過程。是以,使用Mutex會耗時)
2.Mutexes 可以跨程序使用。 Critical section 則隻能夠在同一個程序中使用。(Mutex可以有名字,命名的mutex在作業系統中,是唯一的。是以,可以跨程序)
3.等待一個 mu tex 時,你可以指定“結束等待”的時間長度。但對于critical section 則不行。
如果有某個線程正在等待一個未被激發的mutex,它便将進入“ blocking”(阻塞)狀态。也就是說,該線程會停止執行,直到 mu tex 被其擁有者釋放并處于激發狀态。
Mutex 的擁有權并非屬于那個産生它的線程,而是那個最後對此 mu tex 進行 Wait...() 操作并且尚未進行 ReleaseMutex() 操作的線程。
Mutex 的被摧毀和其擁有權沒有什麼關系。和大部分其他的核心對象一樣, mutex 是在其引用計數降為 0 時被作業系統摧毀的。