Semaphore(信号量)

一、What is Semaphore(信号量)

A semaphore object is a synchronization object that maintains a count between zero and a specified maximum value.
信号量是用于线程同步的内核对象,用来对资源进行计数.

它包含:
使用计数
最大资源计数(32位)
当前资源计数(32位)

最大资源计数在CreateSemaphore时指定

HANDLE WINAPI CreateSemaphore(
    LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
    LONG lInitialCount,
    LONG lMaximumCount,
    LPCTSTR lpName);

lMaximumCount —— 最大资源计数
lInitialCount —— 当前资源计数的初始值

二、Rules

  1. 如果当前资源计数大于0,那么信号量处于触发状态.
  2. 如果当前资源计数等于0,那么信号量处于非触发状态.
  3. 当前资源计数的范围:>=0 && <=最大资源计数
  4. 当wait函数调用成功时,当前资源计数会递减1.
  5. 通过调用ReleaseSemaphore来以指定值递增信号量的当前资源计数.

Note:
1.当前资源计数的递增只能靠程序员通过调用ReleaseSemaphore实现.
当前资源计数的递减只能通过成功调用wait函数实现.

BOOL WINAPI ReleaseSemaphore(
    HANDLE hSemaphore,
    LONG lReleaseCount,
    LPLONG lpPreviousCount);

lReleaseCount
—— 必须大于0,也就是说ReleaseSemaphore只能递增当前资源计数,不能递减.
ReleaseSemaphore用于将当前资源计数 += lReleaseCount,若结果>最大资源计数,则函数调用失败,不会改变当前资源计数.

2.Create Semaphore内核对象时,通常将当前资源计数的初始值设为最大资源计数值.
但有时也会采用这样的策略:在程序初始化时创建Semaphore,并将当前资源计数的初始值设为0,等程序初始化完成时再通过
ReleaseSemaphore使Semaphore处于触发状态.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值