利用事件来实现同步:
#include <iostream.h>
#include<windows.h>
int idx=0;
int tickets=100;
HANDLE g_hEvent;
DWORD WINAPI FunProc1(LPVOID lpParameter){
while(TRUE){
WaitForSingleObject(g_hEvent,INFINITE);
if(tickets>0){
Sleep(1);
cout<<"thread1 sell ticket:"<<tickets--<<endl;
}else{
break;
}
SetEvent(g_hEvent);
}
return 0;
}
DWORD WINAPI FunProc2(LPVOID lpParameter){
while(TRUE){
WaitForSingleObject(g_hEvent,INFINITE);
if(tickets>0){
Sleep(1);
cout<<"thread2 sell ticket:"<<tickets--<<endl;
}else{
break;
}
SetEvent(g_hEvent);
}
return 0;
}
void main(){
HANDLE hThread1=CreateThread(NULL,0,FunProc1,NULL,0,NULL);
HANDLE hThread2=CreateThread(NULL,0,FunProc2,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
SetEvent(g_hEvent);
Sleep(4000);
}
利用临界区来实现同步:
#include <iostream.h>
#include<windows.h>
int idx=0;
int tickets=100;
DWORD WINAPI FunProc1(LPVOID lpParameter);
DWORD WINAPI FunProc2(LPVOID lpParameter);
CRITICAL_SECTION g_cs;
void main(){
HANDLE hThread1=CreateThread(NULL,0,FunProc1,NULL,0,NULL);
HANDLE hThread2=CreateThread(NULL,0,FunProc2,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&g_cs);
Sleep(4000);
DeleteCriticalSection(&g_cs);
}
DWORD WINAPI FunProc1(LPVOID lpParameter){
while(TRUE){
EnterCriticalSection(&g_cs);
if(tickets>0){
Sleep(1);
cout<<"thread1 sell ticket:"<<tickets--<<endl;
}else{
break;
}
LeaveCriticalSection(&g_cs);
}
return 0;
}
DWORD WINAPI FunProc2(LPVOID lpParameter){
while(TRUE){
EnterCriticalSection(&g_cs);
if(tickets>0){
Sleep(1);
cout<<"thread2 sell ticket:"<<tickets--<<endl;
}else{
break;
}
LeaveCriticalSection(&g_cs);
}
return 0;
}