多线程开发学习笔记之线程同步——信号量
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的大小来增加信号量的资源计数。
信号量与临界区和互斥量的不同在于,它不能被认为属于某个线程。也就是说,一个线程可以等待信号量对象(减少它的资源计数),而另一个线程释放该对象(增加它的资源计数)。
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的大小来增加信号量的资源计数。
相关文章推荐
- 多线程开发学习笔记之线程同步——事件
- 多线程开发学习笔记之线程同步——临界区
- 多线程开发学习笔记之线程同步——互斥量
- linux多线程学习笔记三---线程同步之信号量
- 【Cocos2d-x游戏引擎开发笔记(23)】多线程以及线程同步
- IOS开发学习笔记(七)——多线程应用程序开发
- MFC多线程开发学习笔记
- C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent
- Java多线程学习笔记——信号量的使用
- Android应用开发学习笔记之多线程与Handler消息处理机制
- 学习笔记 java多线程 信号量(Semaphore),死锁
- Android开发学习笔记(8):浅谈Handler实现多线程和异步处理
- Android应用开发学习笔记之多线程与Handler消息处理机制
- 多线程学习笔记3:线程同步
- C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent
- C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent
- linux多线程学习笔记四---线程同步之互斥锁、读写锁和条件变量
- C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent
- JAVA学习笔记--多线程(三)synchronized实现线程同步
- 多线程开发学习笔记(1)