- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章 线程与内核对象的同步.PDF
下载
第9章 线程与内核对象的同步
上一章介绍了如何使用允许线程保留在用户方式中的机制来实现线程同步的方法。用户方
式同步的优点是它的同步速度非常快。如果强调线程的运行速度,那么首先应该确定用户方式
的线程同步机制是否适合需要。
虽然用户方式的线程同步机制具有速度快的优点,但是它也有其局限性。对于许多应用程
序来说,这种机制是不适用的。例如,互锁函数家族只能在单值上运行,根本无法使线程进入
等待状态。可以使用关键代码段使线程进入等待状态,但是只能用这些代码段对单个进程中的
线程实施同步。还有,使用关键代码段时,很容易陷入死锁状态,因为在等待进入关键代码段
时无法设定超时值。
本章将要介绍如何使用内核对象来实现线程的同步。你将会看到,内核对象机制的适应性
远远优于用户方式机制。实际上,内核对象机制的唯一不足之处是它的速度比较慢。当调用本
章中提到的任何新函数时,调用线程必须从用户方式转为内核方式。这个转换需要很大的代价:
往返一次需要占用 x 8 6平台上的大约 1 0 0 0个C P U周期,当然,这还不包括执行内核方式代码,
即实现线程调用的函数的代码所需的时间。
本书介绍了若干种内核对象,包括进程,线程和作业。可以将所有这些内核对象用于同步目
的。对于线程同步来说,这些内核对象中的每种对象都可以说是处于已通知或未通知的状态之中。
这种状态的切换是由M i c r o s o f t为每个对象建立的一套规则来决定的。例如,进程内核对象总是在
未通知状态中创建的。当进程终止运行时,操作系统自动使该进程的内核对象处于已通知状态。
一旦进程内核对象得到通知,它将永远保持这种状态,它的状态永远不会改为未通知状态。
当进程正在运行的时候,进程内核对象处于未通知状态,当进程终止运行的时候,它就变
为已通知状态。进程内核对象中是个布尔值,当对象创建时,该值被初始化为 FA L S E (未通知
状态)。当进程终止运行时,操作系统自动将对应的对象布尔值改为T R U E ,表示该对象已经得
到通知。
如果编写的代码是用于检查进程是否仍在运行,那么只需要调用一个函数,让操作系统去
检查进程对象的布尔值,这非常简单。你也可能想要告诉系统使线程进入等待状态,然后当布
尔值从FA L S E 改为T R U E时自动唤醒该线程。这样,你可以编写一个代码,在这个代码中,需
要等待子进程终止运行的父进程中的线程只需要使自己进入睡眠状态,直到标识子进程的内核
对象变为已通知状态即可。你将会看到, M i c r o s o f t 的Wi n d o w s提供了一些能够非常容易地完成
这些操作的函数。
刚才讲了M i c r o s o f t为进程内核对象定义了一些规则。实际上,线程内核对象也遵循同样的
规则。即线程内核对象总是在未通知状态中创建。当线程终止运行时,操作系统会自动将线程
对象的状态改为已通知状态。因此,可以将相同的方法用于应用程序,以确定线程是否不再运
行。与进程内核对象一样,线程内核对象也可以处于已通知状态或未通知状态。
下面的内核对象可以处于已通知状态或未通知状态:
■ 进程 ■ 文件修改通知
■ 线程 ■ 事件
■ 作业 ■ 可等待定时器
第 9章 线程与内核对象的同步计计191
下载
■ 文件 ■ 信标
■ 控制台输入 ■ 互斥对象
线程可以使自己进入等待状态,直到一个对象变为已通知状态。注意,用于控制每个对象
的已通知/ 未通知状态的规则要根据对象的类型而定。前面已经提到进程和线程对象的规则及
作业的规则。
本章将要介绍允许线程等待某个内核对象变为已通知状态所用的函数。然后我们将要讲述
Wi n d o w s提供的专门用来帮助实现线程同步的各种内核对象、如事件、等待计数器,信标和互
斥对象。
当我最初开始学习这项内容时,我设想内核对象包含了一面旗帜(在空中飘扬的旗帜,不
是耷拉下来的旗帜),这对我很有帮助。当内核对象得到通知时,旗
文档评论(0)