线程与内核对象的同步

1.用户方式的线程同步具有速度快的优点。但是它的局限性也是明显的:互锁函数只能在单值上运行,根本无法使线程进入等待状态;可以使用关键代码段使线程进入等待状态,但是只能用这些代码段对单个进程中的线程实施同步;而且使用关键代码段时,很容易进入死锁状态,因为在等待进入关键代码段时无法设定超时值。

2.使用内核对象来实现线程同步的一个不足之处是它的速度比较慢,因为调用线程必须从用户方式转为内核方式。这个转换需要很大的代价:往返一次需要占用x86平台上大约1000个CPU周期。

3.如下的一些内核对象可以处于已通知状态或未通知状态:进程、线程、作业、文件、控制台输入、文件修改通知、事件、可等待定时器、信标、互斥对象。

4.使用WaitForSingleObject来使线程自愿进入等待状态,直到一个特定的内核对象变为已通知为之。该函数的返回值可以为:WAIT_OBJECT_0、WAIT_TIMEOUT、WAIT_FAILED。WaitForMultipleObjects允许调用线程同时查看若干个内核对象的已通知状态。

5.事件对象是最基本的内核对象,它包含一个使用计数,一个用于指明该事件是个自动重置的事件还是一个人工重置的事件的BOOL值,另一个是用于指明该事件处于已通知状态还是未通知状态的BOOL值。使用CreateEvent、OpenEvent、SetEvent以及ResetEvent来处理事件。

6.等待定时器是在某个时间或按规定的间隔时间发出自己的信号通知的内核对象。用于设置定时器的函数有:CreateWaitableTimer、OpenWaitableTimer、SetWaitableTimer、CancleWaitableTimer。也可以使用SetWaitableTimer让等待定时器给APC排队。

7.信标内核对象用于对资源进行计数。它包含两个额外的两个带符号的32位值,一个是最大资源数量,一个是当前资源数量。最大资源数量用于信标能够控制的资源的最大数量,而当前资源数量则用于标识当前可以使用的资源的数量:CreateSemaphore、OpenSemaphore、ReleaseSemaphore。

8.互斥体(mutex)内核对象能够确保线程拥有对单个资源的互斥访问权。互斥体的行为特性与关键代码区相同,但是互斥体属于内核对象,而关键代码段则属于用户方式对象。这意味着互斥体对象的运行速度比关键代码区要慢。但也意味着不同进程中的多个线程能够访问单个互斥体对象,并且意味着线程在等待资源时可以设定一个超时值:CreateMutex、OpenMutex、ReleaseMutex。

9.互斥体对象一个比较特殊的地方是互斥体对象有一个"线程所有权"概念。互斥体对象能够对哪个线程成功地等待到该对象进行跟踪。不拥有该对象的线程试图释放的话返回FALSE,并得到ERROR_NOT_OWNER错误。

10.其他的一些线程同步函数:异步设备I/O、WaitForInputIdle、MsgWaitForMultipleObjects(Ex)、WaitForDebugEvent、SingleObjectAndWait。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值