#include <stdio.h> #include <windows.h> #include <process.h> int iTickets = 5000; CRITICAL_SECTION g_csA; CRITICAL_SECTION g_csB;
DWORD WINAPI SellTicketA(void* lpParam) { while (1) { EnterCriticalSection(&g_csA); Sleep(1); EnterCriticalSection(&g_csB); if (iTickets > 0) { Sleep(1); iTickets--; printf("A remain %d\n", iTickets); LeaveCriticalSection(&g_csB); LeaveCriticalSection(&g_csA); } else { LeaveCriticalSection(&g_csB); LeaveCriticalSection(&g_csA); break; } } return 0; } DWORD WINAPI SellTicketB(void* lpParam) { while (1) { EnterCriticalSection(&g_csB); Sleep(1); EnterCriticalSection(&g_csA); if (iTickets > 0) { Sleep(1); iTickets--; printf("B remain %d\n", iTickets); LeaveCriticalSection(&g_csA); LeaveCriticalSection(&g_csB); } else { LeaveCriticalSection(&g_csA); LeaveCriticalSection(&g_csB); break; } } return 0; } int main() { HANDLE hThreadA, hThreadB; hThreadA = CreateThread(NULL, 0, SellTicketA, NULL, 0, NULL); hThreadB = CreateThread(NULL, 0, SellTicketB, NULL, 0, NULL); CloseHandle(hThreadA); CloseHandle(hThreadB); InitializeCriticalSection(&g_csA); InitializeCriticalSection(&g_csB); Sleep(40000); DeleteCriticalSection(&g_csA); DeleteCriticalSection(&g_csB); system("pause"); return 0; }
|