信号量
相关问题
类似于事件(作用类似),解决通知的相关问题。但提供一个计数器,可以设置次数。
信号量的使用
1.创建信号量
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//参数作废,基本用NULL
LONG lInitialCount,//初始化信号量数量,每碰到一次WaitFor…时,数量减1,当为0时产生阻塞
LONG lMaxximumCount,//信号量的量大值
LPCTSTR lpName //命名
); //创建成功返回信号量句柄
2.等候信号量
WaitForSingleObject/WaitForMulitipuleObjects
每等候通过一次,信号量的信号减1,直到为0阻塞
3.给信号量指定计数值
BOOL ReleaseSemaphore(
HANDLE hSemaphore,//信号量句柄
LONG lReleaseCount,//释放数量
LPLONG lpPreviousCount//释放前原来信号量的数量,可以设置为NULL (在设置信号量次数之前,目前还剩余的计数值);
4.关闭句柄
ColseHandle
#include <Windows.h>
#include <stdio.h>
DWORD g_nCount = 0;
HANDLE g_hSemaphore = 0;
DWORD CALLBACK TestProc(LPVOID lpParam)
{
while(1)
{
WaitForSingleObject(g_hSemaphore,INFINITE);
printf("print--------------%d\n",g_nCount++);
}
return 0;
}
int main()
{
DWORD nID = 0;
g_hSemaphore = CreateSemaphore(NULL,3,10,NULL);
HANDLE hThread = CreateThread(NULL,0,TestProc,NULL,0,&nID);
system("pause");
//每按一次任一键,然后给信号量赋值10,让我们的TestProc线程继续执行。
while(1)
{
system("pause");
ReleaseSemaphore(g_hSemaphore,10,NULL); //将信号量设置为0
}
WaitForSingleObject(hThread,INFINITE);
return 0;
}
以上代码是用主进程控制新创建线程,用信号量来控制新创建线程