信号量 Semaphore 用法及注意事项总结

本文介绍了Windows系统中信号量的核心对象特性,强调了创建时初始值和最大值的设置,以及如何通过WaitForSingleObject和ReleaseSemaphore进行线程同步。通过一个示例程序说明了信号量在多线程中的应用,展示了不恰当释放可能导致的问题。
摘要由CSDN通过智能技术生成

信号量

信号量在WIN32系统中是核心对象,故其用法同其他同步机制类似,但可应用于多个线程同步运行,即同时有至多有限个线程同时工作,而线程上线数量取决于初始化时指定的最大值。

1.创建一个信号量
创建时初始值不要超过信号量最大限度。
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName
);

***例子:HANDLE HS=CreateSemaphore(NULL,0,2,NULL);***//0:初值 2:最大值

2.获得信号量锁定
因为Semaphore是核心对象,所以可以用WaitForSIngleObject()获得锁定,但一次只能锁定一个。对单个 线程来说,其可以用Wait多次锁定,也可以用Release一次释放多个,但有一点,不要释放超过最大限度。

3.解除信号量锁定
程序获得信号量后应当在结束同步控制时将其释放掉。就像退出临界区一样。
解除信号量锁定时尽量一次释放一个,虽然一次可释放多个,但容易出现不可预料的情况,就像最下面的程序例子。
BOOL ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount
);
例:ReleaseSemaphore(HS,1,NULL);

信号量程序实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值