什么是内核?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 这里的事件表示为我们日常生活中的事件 只列出常用,不包含所有对象