词条 | CSemaphore |
释义 | 一个CSemaphore类对象代表一个“信号”——一个同步对象,它允许有限数目的线程在一个或多个进程中访问同一个资源。一个CSemaphore对象保持了对当前访问某一指定资源的线程的计数。对于一个只能支持有限数目用户的共享资源来说,CSemaphore是很有用的。 CSemaphore CObject └CSyncObject └CSemaphore CSemaphore对象的当前计数是还可以允许的其它用户的数目。当这个计数达到零的时候,所有对这个由CSemaphore对象控制的资源的访问尝试都将被插入到一个系统队列中等待,直到它们的时间用完或计数值不再为零。这个被控制的资源可以同时接受访问的最大用户数目是在CSemaphore对象的构造期间被指定的。 要使用一个CSemaphore对象,则在需要的时候构造这个对象。指定你想要等待的信号的名字,应用程序应该在最初就拥有它。然后你就可以在构造函数返回时访问这个信号。当你要访问这个被控制的资源时,调用CSyncObject::Unlock。 使用CSemaphore对象的另一种方法是,将一个CSemaphore类型的变量添加到你想要控制的类中作为一个数据成员。在被控制对象的构造期间,调用CSemaphore数据成员的构造函数来指定访问计数的初始值,访问计数的最大值,信号的名字(如果它要在整个进程中使用),以及需要的安全标志。 要访问由CSemaphore对象用这种方式控制的资源,首先要在你的资源的访问成员函数中创建一个CSingleLock类型或CMultiLock类型的变量。然后调用加锁对象的Lock成员函数(例如,CSingleLock::Lock)。这时,你的线程将达到对资源的访问,等待资源被释放并访问它,或者是在等待资源被释放的过程中超过了时间,对资源的访问失败。不管是哪一种情况,你的资源都是以一种线程安全(thread-safe)方式被访问的。要释放资源,可以使用加锁对象的Unlock成员函数(例如,CSingleLock::Unlock),或者是让加锁对象超越范围。 另外,你可以单独创建一个CSemaphore对象,并且在尝试访问被控制的资源之前显式地访问CSemaphore对象。这种方法虽然对阅读你的源代码的人来说更加清楚,但是却更易于出错。 #include <afxmt.h> CSemaphore类成员 操作 CSemaphore构造一个CSemaphore对象---------------------------------------------------------------------------------------------------------------------------------- CSemaphore::CSemaphore CSemaphore( LONG lInitialCount = 1, LONG lMaxCount = 1, LPCTSTR pstrName= NULL, LPSECURITY_ATTRIBUTES lpsaAttributes = NULL ); 参数: lInitialCount 信号的初始使用计数。必须是大于或等于0,并且小于或等于lMaxCount。lMaxCount 信号的使用计数的最大值。必须大于0。pstrName 信号的名字。如果此信号将在整个进程中被访问,则必须提供这个名字。如果是NULL,则对象将是没有名字的。如果这个名字与一个已经存在的信号的名字一样,则构造函数创建一个新的CSemaphore对象,此对象引用具有这个名字的对象。如果这个名字与一个已经存在的但不是一个信号的同步对象的名字一样,则构造函数会失败。lpsaAttributes 此信号对象的安全标志。有关这个结构的详细描述,参见“Win32 SDK程序员参考”中的SECURITY_ATTRIBUTES。说明: 此成员函数用来构造一个有名字或没有名字的CSemaphore对象。要访问或释放一个CSemaphore对象,可以创建一个CMultiLock或CSingleLock对象,并调用它们的Lock和Unlock函数。 请参阅:CMutex, CEvent, CMultiLock, CSingleLock |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。