#include <stdio.h> #include <windows.h> int tickets=30; /*临界区对象*/ CRITICAL_SECTION g_csA,g_csB; /*线程数据信息*/ DWORD WINAPI Fun1Proc(LPVOID lpParameter) { while(1) { /*进入临界区*/ EnterCriticalSection(&g_csA); Sleep(1); if(tickets>0) { EnterCriticalSection(&g_csB); Sleep(1); printf("thread1 sell ticket:%d\n",tickets--); /*离开临界区*/ LeaveCriticalSection(&g_csA); } else { LeaveCriticalSection(&g_csA); break; } } return 0; } DWORD WINAPI Fun2Proc(LPVOID lpParameter) { while(1) { EnterCriticalSection(&g_csB); Sleep(1); if(tickets>0) { EnterCriticalSection(&g_csA); Sleep(1); printf("thread2 sell ticket:%d\n",tickets--); LeaveCriticalSection(&g_csB); } else { LeaveCriticalSection(&g_csB); break; } } return 0; } int main() { HANDLE hThread1,hThread2; /*创建线程*/ hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); /*创建临界区对象*/ InitializeCriticalSection(&g_csA); InitializeCriticalSection(&g_csB); Sleep(1000); /*释放临界区对象资源*/ DeleteCriticalSection(&g_csA); return 0; }