// 模拟车站售票问题,两个窗口交替售票,这里使用关键段做线程的同步
// 死锁问题
#include <Windows.h>
#include <process.h>
#include <iostream>
using namespace std;
CRITICAL_SECTION g_hSectionA;
CRITICAL_SECTION g_hSectionB;
int g_ticket = 100;
void seller1(LPVOID pvoid) // 线程1
{
while (TRUE) {
EnterCriticalSection(&g_hSectionA); // 代码行1
// Sleep(10);
EnterCriticalSection(&g_hSectionB); // 程序段1
if (g_ticket>0)
{
cout << "售出第" << g_ticket-- << "票" << endl;
}
else
break;
LeaveCriticalSection(&g_hSectionB);
LeaveCriticalSection(&g_hSectionA);
}
}
void seller2(LPVOID pvoid) // 线程2
{
while (TRUE) {
EnterCriticalSection(&g_hSectionB); // 代码行2
// Sleep(10);
EnterCriticalSection(&g_hSectionA); // 程序段2
if (g_ticket>0)
{
cout << "售出第" << g_ticket-- << "票" << endl;
}
else
break;
LeaveCriticalSection(&g_hSectionA);
LeaveCriticalSection(&g_hSectionB);
}
}
int main()
{
InitializeCriticalSection(&g_hSectionA);
InitializeCriticalSection(&g_hSectionB);
_beginthread(seller1, 0, NULL);
_beginthread(seller2, 0, NULL);
Sleep(4000);
DeleteCriticalSection(&g_hSectionA);
DeleteCriticalSection(&g_hSectionB);
system("pause");
return 0;
}
这里如果将上文中的 sleep(1)反注释,就会产生死锁的问题。因为假如先执行到 “代码行1”,遇到sleep(1), 线程1休眠,开始执行 “代码行2”,同样遇到sleep(1),线程2休眠,这时开始执行到 "程序段1",由于关键段 g_hSectionB在执行 “代码行2”信号被隐藏,此时处于无信号状态,停止往下执行。线程2休眠结束,开始执行"程序段2",同样由于关键段变量 g_hSectionA无信号释放,线程2停止执行.进入死循环。