首页 理论教育 实现Semaphore对象的方法

实现Semaphore对象的方法

时间:2023-10-21 理论教育 版权反馈
【摘要】:Semaphore对象从__COMMON_SYNCHRONIZATION_OBJECT对象继承,从而继承了WaitForThisObject方法,该方法用来完成semaphore对象的资源请求(等待)。ReleaseSemaphore函数用来完成semaphore资源的释放工作。如果调用者先前没有调用WaitForThis Object或WaitForThisObjectEx,而直接调用了ReleaseSemaphore,则可能导致资源不一致,产生问题。因此,目前版本的实现中,Semaphore不是一个支持安全调用的对象,使用时应该谨慎。同样地,Semaphore对象从__COMMON_OBJECT对象继承了通用对象都必须实现的方法和变量,比如Initialize、Uninitialize函数等。

实现Semaphore对象的方法

Semaphore是一个内核对象,因此需要从__COMMON_OBJECT对象继承,以利用__COMMON_OBJECT提供的服务,也便于将来向MP(多CPU)扩展,而且semaphore是一个同步对象,因此需要从__COMMON_SYNCHRONIZATION_OBJECT继承,以提供一个通用的同步对象访问接口(当前版本中,主要是继承WaitForThisObject函数接口),因此,semaphore的定义如下:

其中,nCounter是semaphore当前资源计数(即7.8节中的N值),lpWaitingQueue是一个等待队列,所有等待semaphore对象的线程,在没有获得资源(nCounter<=0)的情况下,都将被阻塞,并排在该等待队列中。

由于Semaphore遵循Hello China的对象语义,可以通过CreateObject(ObjectManager的成员函数)函数创建,而目前版本下,该函数(CreateObject)并没有提供设置nCounter初始值的参数,因此,缺省情况下,每当一个semaphore对象被创建完成,其nCounter成员变量初始化为1。为了改变这个缺省值,可以调用SetSemaphoreCounter函数来设置新的nCounter值,该函数(SetSemaphoreCounter)在设置新的nCounter值的同时,返回原先nCounter的数值。

Semaphore对象从__COMMON_SYNCHRONIZATION_OBJECT对象继承,从而继承了WaitForThisObject方法,该方法用来完成semaphore对象的资源请求(等待)。但是在当前版本下,该函数没有实现超时功能(函数中没有指定超时时间的参数),因此,为了实现超时功能,重新引入一个函数WaitForThisObjectEx,该函数实现了WaitForThisObject的所有功能,并增加了超时功能。(www.xing528.com)

ReleaseSemaphore函数用来完成semaphore资源的释放工作。这个函数的调用必须跟在WaitForThisObject或WaitForThisObjectEx之后,但WaitForThisObjectEx的返回原因不能是超时(即如果是因为超时返回,则不能调用该函数)。如果调用者先前没有调用WaitForThis Object或WaitForThisObjectEx,而直接调用了ReleaseSemaphore,则可能导致资源不一致,产生问题。因此,目前版本的实现中,Semaphore不是一个支持安全调用的对象,使用时应该谨慎。

同样地,Semaphore对象从__COMMON_OBJECT对象继承了通用对象都必须实现的方法和变量,比如Initialize、Uninitialize函数等。在实现的时候,必须单独实现这些函数。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈