fangyukuan

永无止境的追求...追求卓越!!!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

信标内核对象用于对资源进行计数

 

vs2008代码下载

信标内核对象的组成 

一个使用数量

一个是最大资源数量(用于标识信标能够控制的资源的最大数量)

一个是当前资源数量(用于标识当前可以使用的资源的数量)

 

信标的使用规则如下

• 如果当前资源的数量大于0,则发出信标信号。

• 如果当前资源数量是0,则不发出信标信号。

• 系统决不允许当前资源的数量为负值。

• 当前资源数量决不能大于最大资源数量。

 

下面的函数用于创建信标内核对象

HANDLE CreateSemaphore(
PSECURITY_ATTRIBUTE psa,
LONG lInitialCount,
LONG lMaximumCount,
PCTSTR pszName);

 

参数psa见内核对象的安全性

参数pszName见-跨越进程边界共享内核对象【命名对象】

 

lMaximumCount参数用于告诉系统,应用程序处理的最大资源数量是多少。由于这是个带符号的32位值,因此最多可以拥有2147483647个资源。

lInitialCount参数用于指明开始时(当前)这些资源中有多少可供使用。

通过调用等待函数,传递负责保护资源的信标的句柄,线程就能够获得对该资源的访问权。从内部来说,该等待函数要检查信标的当前资源数量,如果它的值大于0(信标已经发出信号),那么计数器递减1,调用线程保持可调度状态。信标的出色之处在于它们能够以原子操作方式来执行测试和设置操作,这就是说,当向信标申请一个资源时,操作系统就要检查是否有这个资源可供使用,同时将可用资源的数量递减,而不让另一个线程加以干扰。只有当资源数量递减后,系统才允许另一个线程申请对资源的访问权。

 

调用OpenSemaphore函数,另一个进程可以获得它自己的进程与现有信标相关的句柄:

HANDLE OpenSemaphore(
DWORD fdwAccess,
BOOL bInheritHandle,
PCTSTR pszName
);

 

通过调用ReleaseSemaphore函数,线程就能够对信标的当前资源数量进行递增:

BOOL ReleaseSemaphore(
HANDLE hsem,
LONG lReleaseCount,
PLONG plPreviousCount);

该函数只是将lReleaseCount中的值添加给信标的当前资源数量。通常情况下,为lReleaseCount参数传递1,但是,不一定非要传递这个值。我常常传递2或更大的值。该函数也能够在它的*plPreviousCount中返回当前资源数量的原始值。实际上几乎没有应用程序关心这个值,因此可以传递NULL,将它忽略。

 

为了正确地说明这个问题,让我们来看一看应用程序是如何使用信标的。比如说,我正在开发一个服务器进程,在这个进程中,我已经分配了一个能够用来存放客户机请求的缓冲区。我对缓冲区的大小进行了硬编码,这样它每次最多能够存放5个客户机请求。如果5个请求尚未处理完毕时,一个新客户机试图与服务器进行联系,那么这个新客户机的请求就会被拒绝,并出现一个错误,指明服务器现在很忙,客户机应该过些时候重新进行联系。当我的服务器进程初始化时,它创建一个线程池,里面包含5个线程,每个线程都准备在客户机请求到来时对它进行处理。

开始时,没有客户机提出任何请求,因此我的服务器不允许线程池中的任何线程成为可调度线程。但是,如果3个客户机请求同时到来,那么线程池中应该有3个线程处于可调度状态。使用信标,就能够很好地处理对资源的监控和对线程的调度,最大资源数量设置为5,因为这是我进行硬编码的缓冲区的大小。当前资源数量最初设置为0,因为没有客户机提出任何请求。当客户机的请求被接受时,当前资源数量就递增,当客户机的请求被提交给服务器的线程池时,当前资源数量就递减。


本文地址http://www.cnblogs.com/fangyukuan/archive/2010/09/05/1818316.html

posted on 2010-09-05 04:07  fangyukuan  阅读(997)  评论(0编辑  收藏  举报