死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
#include <stdio.h>
#include <windows.h>
#include <process.h>
int iTickets = 5000;
CRITICAL_SECTION g_csA;
CRITICAL_SECTION g_csB;
// A窗口 B窗口
DWORD WINAPI SellTicketA(void* lpParam)
{
while (1)
{
EnterCriticalSection(&g_csA);//进入临界区A
Sleep(1);
EnterCriticalSection(&g_csB);//进入临界区B
if (iTickets > 0)
{
Sleep(1);
iTickets--;
printf("A remain %d\n", iTickets);
LeaveCriticalSection(&g_csB);//离开临界区B
LeaveCriticalSection(&g_csA);//离开临界区A
}
else
{
LeaveCriticalSection(&g_csB);//离开临界区B
LeaveCriticalSection(&g_csA);//离开临界区A
break;
}
}
return 0;
}
DWORD WINAPI SellTicketB(void* lpParam)
{
while (1)
{
EnterCriticalSection(&g_csB);//进入临界区B
Sleep(1);
EnterCriticalSection(&g_csA);//进入临界区A
if (iTickets > 0)
{
Sleep(1);
iTickets--;
printf("B remain %d\n", iTickets);
LeaveCriticalSection(&g_csA);//离开临界区A
LeaveCriticalSection(&g_csB);//离开临界区B
}
else
{
LeaveCriticalSection(&g_csA);//离开临界区A
LeaveCriticalSection(&g_csB);//离开临界区B
break;
}
}
return 0;
}
int main()
{
HANDLE hThreadA, hThreadB;
hThreadA = CreateThread(NULL, 0, SellTicketA, NULL, 0, NULL); //2
hThreadB = CreateThread(NULL, 0, SellTicketB, NULL, 0, NULL); //2
CloseHandle(hThreadA); //1
CloseHandle(hThreadB); //1
InitializeCriticalSection(&g_csA); //初始化关键代码段A
InitializeCriticalSection(&g_csB); //初始化关键代码段B
Sleep(40000);
DeleteCriticalSection(&g_csA);//删除临界区
DeleteCriticalSection(&g_csB);//删除临界区
system("pause");
return 0;
}