关键代码段在很多硬件系统(比如Linux,ucOS等等)也存在,只是系统开发用于来保护现场,根据上Demo,更改如下:
#include<windows.h>
#include<iostream.h>
DWORD WINAPI FuncThreadone(LPVOID lpParameter);
DWORD WINAPI FuncThreadTwo(LPVOID lpParameter);
int index=0;
int tickets=100;
HANDLE hMutex;
HANDLE m_hEvent;
CRITICAL_SECTION g_cs;
void main(){
HANDLE hThread1;
HANDLE hThread2;
hMutex=CreateMutex(NULL,0,NULL);
m_hEvent=CreateEvent(NULL,FALSE,TRUE,NULL);
//SetEvent(m_hEvent);
hThread1=CreateThread(NULL,0,FuncThreadone,NULL,0,NULL);
hThread2=CreateThread(NULL,0,FuncThreadTwo,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
cout<<"main thread is running"<<endl;
//Sleep(10);
InitializeCriticalSection(&g_cs);
Sleep(4000);
DeleteCriticalSection(&g_cs);
//CloseHandle(m_hEvent);
}
DWORD WINAPI FuncThreadone(LPVOID lpParameter){
//cout<<"thread one is running !"<<endl;
while(1){
//WaitForSingleObject(hMutex,INFINITE);
//WaitForSingleObject(m_hEvent,INFINITE);
//ResetEvent(m_hEvent);
EnterCriticalSection(&g_cs);
if(tickets>0){
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
//SetEvent(m_hEvent);
LeaveCriticalSection(&g_cs);
}else{
//SetEvent(m_hEvent);
LeaveCriticalSection(&g_cs);
break;
}
//ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI FuncThreadTwo(LPVOID lpParameter){
//cout<<"thread two is running !"<<endl;
while(1){
//WaitForSingleObject(hMutex,INFINITE);
//WaitForSingleObject(m_hEvent,INFINITE);
//ResetEvent(m_hEvent);
EnterCriticalSection(&g_cs);
if(tickets>0){
Sleep(1);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
LeaveCriticalSection(&g_cs);
//SetEvent(m_hEvent);
}else{
//SetEvent(m_hEvent);
LeaveCriticalSection(&g_cs);
break;
}
//ReleaseMutex(hMutex);
}
return 0;
}