您的位置:首页 > 其它

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

2008-02-15 11:18 381 查看
信号量(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的大小来增加信号量的资源计数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: