知识点概述:
此方式的同步机制远远优于用户模式机制,唯一缺点是速度慢(用户模式转入内核模式)
进程或线程内核对象总是在未通知的状态下(FALSE)创建,在停止运行时操作系统将状态改为已通知状态(TRUE)
内核对象在未通知的状态下,不可调度,已通知状态可调度
等待函数
WaitForSingleObject(HANDLE hObject,DWORD dwMillSec);
第二个参数INFINITE表示永远等下去,不过不会浪费CPU时间
WaitForMultipleObjects 等待多个内核对象
fWaitAll TRUE表示等待所有内核对象变为已通知状态,此函数才返回,FALSE表示有任何一个内核对象变为已通知状态就返回,返回WAIT_OBJRCT_0与dwCount-1之间的一个值,表示句柄数组的索引下标即哪个对象变为了已通知状态
事件对象
CreateEvent(安全属性,是否人工重置,初始通知状态,时间名称);
适用于一个线程执行一部分初始化,然后通知另一个线程执行剩余的操作
SetEvent更改状态为已通知
ResetEvent更改状态为未通知
自动重置的副作用会在等到该对象时把状态改为未通知,所以自动的时候不必调用ResetEvent,而人工的时候需要调用
人工重置时会把等待的所有线程变为可调度状态,而自动重置则是把其中的一个线程变为可调度状态,并且不可控
等待定时器内核对象
CreateWaitableTimer(安全属性,是否人工重置,名称); //总是在未通知状态创建
适用于在某个时间执行某个操作
SetWaitableTimer更改状态为已通知
等待定时器给APC项排队
定时器的松散特性,与用户定时器(SetTimer)的区别
信标内核对象
有效处理资源的监控和线程的调度,包括最大资源数和当前资源数
信标使用规则:
当前资源大于0,则发出信标信号,等于0不发出
当前资源数不能为负数,也不能大于最大数
CreateSemaphore(安全属性,初始数,最大数,名称)
OpenSemaphore
ReleaseSemaphore 递增当前资源
互斥对象内核对象
确保线程拥有对单个资源的互斥访问权
行为特性与关键区相同,不同的是关键区属于用户方式对象,而非内核对象。所以互斥的运行速度要慢,但是不同进程中的多个线程能访问单个互斥对象,并且线程在等待的时候可以设置超时值
CreateMutex(安全属性,fInitialOwner,名称)
fInitialOwner=FALSE(一般情况)ID和计数设为0,发出通知信号,不可调度
fInitialOwner=TRUE 对象的线程ID设为调用线程ID,计数设为1,不发出通知信号,可调度状态
ReleaseMutex
违反异常的规则:一个线程等待一个未通知的互斥对象时,如果获取互斥对象的线程ID与互斥对象中记录的ID相同时,尽管未通知状态,也允许线程可调度
不同于其他内核对象,互斥有线程所有权的概念,这也是异常规则产生的原因