信号量主要将用到四个函数。下面是这些函数的原型和使用说明。
CreateMutex创建互斥量
/** \brief 创建一个信号量
*
* \param lpSemaphoreAttributes 表示安全控制,一般直接传入NULL。
* \param lInitialCount 设置信号量的初始计数。可设置零到lMaximumCount之间的一个值
* \param lMaximumCount 设置信号量的最大计数
* \param lpName 指向信号量对象名的指针
* \return 成功,就返回信号量对象的句柄;0表示出错
*
*/
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName
);
OpenMutex打开互斥量
/** \brief 打开信号量
*
* \param dwDesiredAccess 表示访问权限,对互斥量一般传入SEMAPHORE_ALL_ACCESS。
* \param bInheritHandle 表示信号量句柄继承性,一般传入TRUE即可
* \param lpName 指向信号量对象名的指针
* \return 成功返回一个表示信号量的句柄,失败返回NULL
*
*/
HANDLE OpenSemaphore(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
);
ReleaseMutex触发互斥量
/** \brief 对指定的信号量增加指定的值
*
* \param hSemaphore 所要操作的信号量对象的句柄,这个句柄是CreateSemaphore或者OpenSemaphore函数的返回值
* \param lReleaseCount 表示增加个数,必须大于0且不超过最大资源数量
* \param lpPreviousCount 指向返回信号量上次值的变量的指针,如果不需要信号量上次的值,那么这个参数可以设置为NULL
* \return 如果成功返回TRUE,如果失败返回FALSE
*
*/
BOOL ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount
);
CloseHandle销毁信号量
由于信号量是内核对象,因此使用CloseHandle()就可以(这一点所有内核对象都一样)
/** \brief 关闭一个内核对象
*
* \param hObject 代表一个已打开对象handle。
* \return TRUE:执行成功;FALSE:执行失败,可以调用GetLastError()获知失败原因。
*
*/
BOOL CloseHandle(HANDLE hObject);
示例
线程1与线程2依次进行
#include <stdio.h>
#include <Windows.h>
#include <process.h>
void Thread1(void*);
void Thread2(void*);
/* 线程句柄 */
HANDLE h1, h2;
/* 信号量句柄 */
HANDLE hs1, hs2;
/* 主线程 */
int main()
{
/* 创建信号量 */
hs1 = CreateSemaphore(NULL, 1, 1, NULL);
hs2 = CreateSemaphore(NULL, 0, 1, NULL);
/* 创建线程 */
h1 = (HANDLE)_beginthread(Thread1, 0, NULL);//线程1
h2 = (HANDLE)_beginthread(Thread2, 0, NULL);//线程2
WaitForSingleObject(h1, INFINITE);
return 0;
}
/* 线程1 */
void Thread1(void* arg)
{
while (1)
{
/* 等待信号量1 最大等待时间为无穷 */
WaitForSingleObject(hs1, INFINITE);
printf("Thread111111\n");
Sleep(100);
/* 释放信号量2 */
ReleaseSemaphore(hs2, 1, NULL);
}
}
/* 线程2 */
void Thread2(void* arg)
{
while (1)
{
/* 等待信号量2 最大等待时间为无穷 */
WaitForSingleObject(hs2, INFINITE);
printf("Thread222222\n");
Sleep(100);
/* 释放信号量1 */
ReleaseSemaphore(hs1, 1, NULL);
}
}
输出结果