有关win32信号量和事件在多线程使用的小例子

#include "windows.h"
#include "stdio.h"
#include "conio.h"
HANDLE g_hEvent = NULL;
HANDLE g_hSem = NULL;
long num = 0;
int ch = 'a';
DWORD CALLBACK PrintProc(LPVOID pParam){
	HANDLE nHandle [2] ={g_hSem, g_hEvent};
	while(1){
		DWORD nRet = WaitForMultipleObjects(2, nHandle, FALSE , INFINITE);
		if( nRet == 0){
			printf("*******\n");
		}else{
			return 0;
		}
	}
	return 0;
}
DWORD CALLBACK ControlProc(LPVOID pParam){
	while(1){
		char cInput = getch();
		if(cInput =='E' || cInput == 'e'){
			SetEvent (g_hEvent);
			return 0;
		}
		int nCount = cInput - '0';
		if(nCount > 0 && nCount < 10){
			ReleaseSemaphore(g_hSem,  nCount, NULL);
		}
	}
	return 0;
}
int main(int argc, char* argv[]){
	g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //“开始无信号”
	g_hSem = CreateSemaphore(NULL, 0, 10, NULL);
	DWORD nID = 0;
	HANDLE hThread[2] = {0};
	 hThread[0] = CreateThread(NULL, 0, PrintProc, NULL, 0, &nID);
	 hThread[1] = CreateThread(NULL, 0, ControlProc, NULL, 0, &nID);
	WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
	CloseHandle(g_hEvent);
	CloseHandle(g_hSem);
	CloseHandle(hThread[0]);
	CloseHandle(hThread[1]);
	printf("Exit naturally\n");
	return 0;
}
信号量是控制线程访问的次数,信号量每次访问一次,就会导致是其中记录变量减一,减到0后线程就不能继续访问了。这时候就需要通过ReleaseSemaphore函数来将其记录量增加




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值