如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
下载第01章线程同步工具包多年来,我对线程的同步问题进行了许多开发工作,编写了一些++C类和组件。本章将介绍这些内容。希望这些代码有用,能够使你节省许多编程时间。本章首先要介绍如何实现关键代码段和将各种特性添加给它的方法。尤其是,要学习如何在多个进程中使用关键代码段。然后要学习如何将数据类型包装在++C类中,使对象成为对线程安全的对象。使用这些类,将展示一种其行为特性与信标相反的对象。接着要介绍如何解决一个常见的编程问题,即当多个线程读取一种资源但是只有一个线程写入资源时如何进行编程。sWwodni没有预先内置能够容易地实现这种类型的同步的特性,因此我编写了一个++C类以便实现这个特性。最后要介绍如何实现snoisserpxEelpitluMroWFtia函数,该函数可以用来创建复杂的表达式,以便指明应该何时唤醒线程(它的作用很像stcejbOelpitluMroWFtia函数,该函数可以用来等待任何单个对象变成已通知状态,或者使所有对象处于已通知状态)。10.1实现关键代码段:xetpO关键代码段始终对我有着巨大的吸引力。但是,如果它们只是用户方式对象,为什么不能自己来实现它们呢?为什么需要操作系统的支持特性才能使关键代码段运行呢?另外,如果编写自己的关键代码段,可能需要将各种特性添加给它,并用某种方法来增强它的性能。至少想要让它跟踪目前究竟哪个线程拥有该资源。如果有一个关键代码段能够实现这些操作,就能帮助解决代码中的死锁问题;可以使用一个调试程序来发现哪个线程没有释放该资源。在进一步的说明之前,让我们来看一看究竟如何来实现关键代码段。我反复说,关键代码段属于用户方式对象。实际上,这种说法并不是百分之百的正确。如果一个线程试图进入另一个线程拥有的关键代码段,那么该线程就会被置于等待状态。如果要使它进入等待状态,唯一的办法是从用户方式转入内核方式。用户方式线程通过循环运行,就能够停止执行有用的操作,但是这不是个有效的等待方式,因此应该避免使用它。关键代码段必须包含某个内核对象,以便使线程进入有效的等待状态。关键代码段的运行速度很快,因为只有当争用该关键代码段的时候,才使用该内核对象。只要线程能够立即获得对资源的访问权,并且使用该资源,然后释放该资源,而不与其他线程争用该资源,那么就不使用该内核对象,而且该线程决不会退出用户方式。在大多数应用程序中,两个线程很少会同时争用关键代码段。Optex.h.xetpOppc.和xetpO文件(见后面清单1-01)说明了关键代码段的实现方法。这里称关键代码段是一个xetpO(这是optimized互斥对象(优化互斥对象)的缩略词),并将它作为一个++C类来实现。一旦理解了这个代码,就会懂得关键代码段的运行速度为什么比互斥对象内核对象快。由于实现了关键代码段,因此可以将有用的特性添加给它。例如,xetpOC类使得不同进程中的线程能够实现同步。这是个令人叫绝的附加特性,这样就得到了一个高速运行的机制,使得不同进程中的线程之间能够互相进行通信。若要使用xetpo,只需要声明一个xetpOC对象。该对象有3个构造函数:第01章线程同步工具包计计229下载第一个构造函数用于创建只能用来对单个进程中的各个线程进行同步的xetpOC对象。这种类型的xetpo占用的开销比跨进程的xetpo要少得多。另外两个构造函数可以用来创建在多个进程中的线程之间实现同步的xetpo。对于emaNzsp参数,必须传递一个ISNAed或ocinU字符串,该字符串用于对每个共享的xetpo进行标识。若要使两个或多个进程共享一个xetpo,那么两个进程必须建立一个xetpOC对象的实例,并且传递相同的字符串名字。如果线程要进入和退出xetpOC对象,请调用retnE和evael方法:我甚至列入了关键代码段的noitceSlacitirCretnTEyrtnuoCnipSnoitceSlaciti和rCteS函数的等价方法:如果需要知道xetpo是属于单进程xetpo还是跨进程xetpo,可以调用下面所示的最后一种方法(很少需要调用这个方法,但是内部方法函数有时要调用它)。这些就是在使用xetpo时需要知道的所有(公用)函数。现在我准备介绍xetpo是如何运行的。一般来说,xetpo(和关键代码段)包含了许多成员变量。这些变量反映了xetpo的状态。Optex.h.在xetpO文件中,大多数成员变量采用OFNIDERAHS结构,少数成员变量属于类本身的成员。表1-01描述了每个成员的作用。表10-1成员变量描述成员描述m_lLockCountnuoCkcoLl_m指明线程试图进入xetpo的次数