多线程开发学习笔记之线程同步——信号量

         信号量(Semaphore)和互斥量一样,属于内核对象。它自动执行可用资源查询的测试,如果有可用资源,则可用资源的计数减少,从而避免其它线程请求资源。当该线程释放该资源后,可用资源计数增加,则操作系统允许另一个线程请求资源。

        信号量与临界区和互斥量的不同在于,它不能被认为属于某个线程。也就是说,一个线程可以等待信号量对象(减少它的资源计数),而另一个线程释放该对象(增加它的资源计数)。

        Win32 API提供了几个函数用于支持信号量。使用Win32 API产生一个信号量,必须首先调用CreateSemaphore()函数,该函数描述如下:

/*!
 * Brief 创建一个信号量
 
 *@param lpSemaphoreAttributes 指定安全属性,如果是NULL就表示使用默认属性。
 *@param lInitialCount 用于指定该信号量的初始资源计数,必须大于或等于0,并且小于或等于lMaximumCount。
 *@param lMaximumCount 指定信号量的最大资源计数。
 *@param lpName 是赋给信号量的字符串名字。
 
*/

HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, 
LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName);
      你可以根据信号量的字符串名字得到该信号量的句柄:
/*! Brief 得到一个信号量句柄。

 *@param dwDesiredAccess 访问方式,同互斥量参数。
 *@param bInheritHandle 继承特性,同互斥量参数。
 *@param lpName 信号量名字。
 
*/

HANDLE OpenSemaphore(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName);
      释放信号量函数:
/*! Brief 释放信号量句柄。

 *@param hSemaphore 信号量的句柄。
 *@param lReleaseCount指信号量现值的增额,该值必须大于0。
 *@param lpPreviousCount 传回信号量原来的计数,可以为NULL。
 
*/

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

        释放信号量函数与释放互斥量函数形式相同,但不同之处在于:一、任意线程可以在任意时刻调用此函数,因为信号量对象不为某个线程拥有。二、ReleaseSemaphore()函数可以用大于1的大小来增加信号量的资源计数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值