您的位置:首页 > 编程语言

(摘自windows核心编程之用内核对象进行线程同步)

2014-06-18 16:30 387 查看
信号量内核对象(Windows核心编程 p.251)

信号量内核对象用来对资源进行计数。包含一个使用计数,还包含另外两个32位值:一个最大资源计数和一个

当前资源计数。

创建信号量内核对象函数:

HANDLE CreateSemaphore(

PSECURITY_ATTRIBUTE psa,

LONG lInitialCount,

LONG lMaximumCount,

PCTSTR pszName);

参数lMaximumCount 告诉系统应用程序能处理的资源的最大数量。

参数lInitialCount 表示这些资源中一开始有多少个可供使用。

信号量的规则如下:

<如果当前资源计数大于0,那么信号量处于触发状态。

<如果当前资源计数等于0,那么信号量处于未触发状态。

<系统绝对不会让当前资源计数变为负数。

<当前资源计数绝对不会大于最大资源计数。

//最大资源数4,一开始可供使用的资源为0个,因为当前资源计数器可供使用的资源为0个,所以

//信号量未被触发。任何等待该信号量的线程将处于等待状态。

g_hSemaphoreBufferFull = CreateSemaphore(NULL, 0, 4, NULL);

线程通过调用ReleaseSemaphore来递增信号量的当前资源计算。

BOOL ReleaseSemaphore(

HANDLE hSemaphore,

LONG lReleaseCount,

PLONG plPreviousCount

)

这个函数只是把lReleaseCount的值加到信号量的当前资源计数上。通常我们会传1给lReleaseCount参数。

为了获得对被保护资源的访问权,线程要调用一个等待函数(WaitForSingleObject)并传入信号量句柄。在内部,

等待函数会检查信号量的当前资源数,如果它的值大于0(信号量处于触发状态),那么函数会把计数器减一,

并让调用线程继续运行。

线程通过调用ReleaseSemaphore来递增信号量的当前资源计数:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: