“读者--写者”问题练习题目:南北桥问题

有桥如下图所示,车流如箭头所示,桥上不允许两车交汇,但允许同方向多辆车依次通过(即桥上可以有多个同方向的车)。用P、V操作实现交通管理以防止桥上堵塞【北京大学 1992】


解析:这个题目要解决:南、北互斥(桥上不允许两车交汇,相当于“读、写互斥”),需要设置一个互斥信号量mutex,初值为1;南、南共享(相当于“读、读共享”),套用实现“读、读共享”的模式,需要设置一个共享变量southcount,用于记录当前桥上向南行驶过桥的车辆数目,初值为0,再设置一个互斥信号量smutex,实现对southcount的互斥访问;北、北共享(也相当于“读、读共享”),套用实现“读、读共享”的模式,同理可得。

semaphore mutex = 1;// 作为桥的互斥访问信号量
semaphore smutex = 1;// 作为southcount的互斥访问信号量
semaphore nmutex = 1;// 作为northcount的互斥访问信号量
int southcount = 0;// 记录南方向的车辆的数量
int northcount = 0;// 记录北方向的车辆的数量
void south()
{
	while(true)
	{
		wait(smutex);
		if(southcount == 0)
			wait(mutex);
		southcount++;
		signal(smutex);
		// 南方车辆通过
		wait(smutex);
		southcount--;
		if(southcount == 0)
			signal(mutex);
		signal(smutex);
	}
}
void north()
{
	while(true)
	{
		wait(nmutex);
		if(northcount == 0)
			wait(mutex);
		northcount++;
		signal(nmutex);
		// 北方车辆通过
		wait(nmutex);
		northcount--;
		if(northcount == 0)
			signal(mutex);
		signal(nmutex);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值