死锁问题


// 模拟车站售票问题,两个窗口交替售票,这里使用关键段做线程的同步

// 死锁问题

#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停止执行.进入死循环。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值