CSemaphore

CObject
 └CSyncObject
    └CSemaphore

一个CSemaphore类对象代表一个“信号”——一个同步对象,它允许有限数目的线程在一个或多个进程中访问同一个资源。一个CSemaphore对象保持了对当前访问某一指定资源的线程的计数。
对于一个只能支持有限数目用户的共享资源来说,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对象