线程安全中经典的购票问题,没有找到正确的答案,特意写了一份,请大佬们斧正[/抱拳][/抱拳]
#include<iostream>
using namespace std;
#include<Windows.h>
int g_dwTickets = 10;
int g_dwLock = 1;
CRITICAL_SECTION cs;
DWORD WINAPI TicketShop1(LPVOID lpParameter) {
while (g_dwTickets > 0) { //判断是否还有余票
EnterCriticalSection(&cs);
if (g_dwTickets > 0) {
Sleep(500);
printf("***************剩余票数:%d***************\n", g_dwTickets);
g_dwTickets--;
printf("***************卖出一张,还有%d张余票***************\n", g_dwTickets);
LeaveCriticalSection(&cs);
Sleep(50);
}
}
return 0;
}
DWORD WINAPI TicketShop2(LPVOID lpParameter) {
while (g_dwTickets > 0) { //判断是否还有余票
EnterCriticalSection(&cs);
if (g_dwTickets > 0) {
Sleep(500);
printf("----------------剩余票数:%d----------------\n", g_dwTickets);
g_dwTickets--;
printf("----------------卖出一张,还有%d张余票----------------\n", g_dwTickets);
LeaveCriticalSection(&cs);
Sleep(50);
}
}
return 0;
}
int main(int argc,char* argv[]) {
HANDLE arrThread[2] = {0};
InitializeCriticalSection(&cs);
arrThread[0]=CreateThread(NULL, 0, TicketShop1, NULL, 0, 0);
arrThread[1]=CreateThread(NULL, 0, TicketShop2, NULL, 0, 0);
getchar();
return 0;
}
执行结果: