#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函数来将其记录量增加