【Windows核心编程笔记】第九章 线程与内核对象的同步

知识点概述:

此方式的同步机制远远优于用户模式机制,唯一缺点是速度慢(用户模式转入内核模式)

 

进程或线程内核对象总是在未通知的状态下(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相同时,尽管未通知状态,也允许线程可调度

不同于其他内核对象,互斥有线程所有权的概念,这也是异常规则产生的原因

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值