windows核心對象,其實說白了就是:
windows核心處理任何事件能夠有條不紊地進行,是怎麼安排和啟動並執行內部機制(其中包含事件機制,互斥鎖機制和訊號量機制,等待機制)。
"汽車場有車位,汽車過來停車"的例子來形象解釋關於windows核心對象的含義,
1.Event
N(無窮)車N(無窮)車位。對於人工重設event,就像有無窮車位的停車場。停車場一開放(SetEvent),所有等待(WaitForSingleObject)的汽車(等待線程)都可以進去停車。停車場一關閉(ResetEvent),所有的汽車(線程)都進不去。
N(無窮)車1車位。對於自動重設event,就是只有一個車位的停車場。停車場一開放(SetEvent),只有一輛汽車(線程)進去停車。當有汽車進去停車時,因為只有一個車位已滿,停車場自動關閉,這樣其它汽車必須繼續等待。等該汽車開走,必須要重新開放停車場(SetEvent),這樣才能讓其它車進來;否則的話所有的車還必須等著。
2. Mutex
N(無窮)車1車位。
可以看作是自動重設Event,雖然實現原理可能不一樣。既然是其中情況之一,那麼使用起來也更簡單。
一輛車搶佔車位,其它車都要等待。該車開走,必須調用ReleaseMutex釋放車位,供別的車進入。
相比於Event來說,mutex可以看做是一個永久開放的停車場(也就是不再設定開關)。所有的車公平競爭,先到先停;但是同時最多隻可能有一輛汽車佔位。
3. Semaphore
N(無窮)車M(有限)車位。一定要搞清楚我們重點關心的是當前已經停車的車位元,還是剩下可用的車位元。
當有一輛車來時,想申請一個車位(ReleaseSemaphore);如果有剩餘車位,將成功申請,並可返回當前已經用去的車位。此時已經用去的車位將加1。
但是如果剩餘的車位為0,也就是說因為車位已停滿,那麼申請將失敗,停車場也關閉,剩下的都將等待。
如果要騰出一個車位,必須移走一輛車,此時要求必須有車停著才能移走(WaitForSingleObject);移走一輛車後剩餘的車位將多1個,佔據的車位將會少一個。
這個核心對象設計的非常糟糕,概念非常模糊和對立,取名也非常含糊。例如:WaitForSingleObject是減,但是它的判斷條件是已停車車位是否存在;而ReleaseSemaphore卻是增,不過判斷條件卻是剩餘空車位是否存在。
此外,從字面意思看,ReleaseSemaphore絕對是減,但是乾的卻是增的事。
總之來說,核心對象,其他的非常容易理解,就這個如果深究下去就會讓人崩潰4. WaitForSingleObject
等待。條件滿足才能繼續運行線程。
4. WaitForSingleObject
等待。條件滿足才能繼續運行線程。
•Event成立的條件是好運來了,停車場開放,並且有空車位;
•Mutex成立的條件是,有空車位(停車場永遠開放的);
•Semaphore成立的條件是,有車停著;
5. 適用場合
•Event用於條件通知;
•Mutex用於互斥競爭;
•Semaphore用於讀寫個數限制。