什么是內核?windows操作系統為了更好的管理進程,線程,創建了很多數據結構,這些數據結構運行在windows的底層,並不開放給開發人員;所以開發人員稱這些結構為內核,但是為了開發人員能夠使用,windows將內核封裝為句柄並開放,所以句柄就是指向內核數據結構的一個程序員可以使用的對象。
我們前面所說的用戶模式下的線程同步有一個缺點,就是不能誇進程來實現同步:比如QQ進程在啟動的時候需要啟動一個QQ密碼保護進程,這種問題就需要通過內核模式下的線程同步。
前面所說,同步問題就是A等B的問題,如何讓線程A等待,在內核模式下有如下方式
WaitForSingleObject(HANDLE hobject,DWORD waittime)
等待一個對象
WaitFormULTIPLEObjects(
dword DWcOUNT //等待多少個內核對象
HANDLE* hobjectS //是哪些?
BOOL waitAll, //是否等待所有
DWORD waittime)
等待多個對象
WaitForInputIdle(HANDLE hProcess ,DWORD waittime)
等到hProcess所指定的進程處理完所有的消息
MSGwaitForMultipleObjects(Ex)
等待多個對象,或者當指定的內核對象所代表的線程中有消息進入
WaitForDebugEvent
等待被調試的線程發生某個事件時(比如運行到斷點,程序結束等)
SignalObjectandWait(
Handle hObjectToSignal
HANDLE hobectTowaitOn,
DWORD waittime
BOOL alertable)
等待hobectTowaitOn對象,並在同時讓hObjectToSignal觸發【該操作是一個原子操作】
線程A要等到什么時候呢?
1.時間到:每一個等待函數都會制定一個等待時間,當時間一到,線程就醒來,繼續執行。
【這個時間可以設置為INFINITE表示線程A要等到永遠,直到事件觸發】
2.事件觸發:人們等待通常是等到某個事件發生。比如:屌絲男要等到女神回心轉意,才肯婚娶;
玩家2要等到花兒也謝了才出牌;哲學家3要等到明白宇宙究竟是由哪種元素組成才肯閉眼。
在windows中,內核對象的數據結構有一個標志用來表示內核所表示的事件是否發生:如果事件發生,我們叫觸發,如果沒有發生,我們叫該對象未觸發。下面就來看一下這些內核對象所表示的事件
只列出常用,不包含所有對象
內核對象 觸發 進程 結束進程 進程的結束 線程 結束線程 線程的結束 互斥量Mutex ReleaseMutex函數調用之后 互斥量只能有一個線程使用,當一個線程釋放成功互斥量的時候,就表示該線程使用完了,其他線程可以用了 信號量 ReleaseSemaphore調用之后 創建好10個廁所,只要有空廁所,事件就觸發 事件 SetEvent PulseEvent 這里的事件表示為我們日常生活中的事件
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。