关键代码段在很多硬件系统(比如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;

}