死锁问题


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

// 死锁问题

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





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redisson是一个基于Redis的Java驻留内存数据网格(In-Memory Data Grid)和分布式框架。在使用Redisson时,可能会遇到问题是指两个或多个线程在互相等待对方释放资源的情况下无限期地阻塞的现象。在Redisson中,问题通常发生在分布式的使用过程中。 造成Redisson问题的原因可能有以下几点: 1. 程序逻辑错误:在使用分布式时,如果程序逻辑不正确,可能会导致。例如,一个线程获取了但没有释放,导致其他线程无法获取而陷入状态。 2. 超时设置不合理:在使用Redisson分布式时,可以设置的超时时间。如果超时时间设置过长,可能会导致其他线程长时间等待而出现。 3. 高并发场景下的竞争:在高并发场景下,多个线程同时请求获取,可能会导致竞争激烈,从而增加了的风险。 为了避免Redisson问题,可以采取以下措施: 1. 合理设计程序逻辑:确保在获取后及时释放,避免出现情况。 2. 设置合理的超时时间:根据实际业务需求,设置适当的超时时间,避免长时间等待而导致。 3. 使用可重入:Redisson提供了可重入(ReentrantLock)的实现,可以避免同一个线程重复获取而导致。 4. 使用RedLock算法:RedLock是Redisson提供的一种分布式算法,可以在多个Redis节点之间协作,提高分布式的可靠性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值