忙等待实现互斥方案

文章介绍了使用while循环、严格轮转法、TSL指令(TestandSetLock)、swap指令和CAS指令(CompareandSwap)在编程中实现临界区互斥控制的方法,确保同一时间只有一个进程访问关键资源。
摘要由CSDN通过智能技术生成

一 锁变量的实现

while(LOCK);	//只要临界区有进程,lock就等于1,就一直等待
				//某一时刻,临界区进程执行完毕,那么LOCK=0;while循环结束
LOCK=1;			//那么其他进程(假设A进程)就要进入临界区
				//令LOCK=1,不让其它进程(除A之外)进入
<critical section> //进入临界区

LOCK=0;				//出临界区

<non_critical section>

二 严格轮转法

进程0:
while(turn!=0);			//只要turn变量不为0 就是为1 说明进程0不能运行
						//一旦跳出while循环 表示turn=0
<critical section>		//进入临界区
turn=1;					//出来之后令turn=1
<non_critical section>	//非临界区区域

进程1:
while(turn!=1);
<critical section>		//进入临界区
turn=0;					//出来之后令turn=0
<non_critical section>	//非临界区区域

三 TSL指令实现互斥(Test and set Lock)

#include<iostream>
using namespace std;
int lock=0;
void TSL(int *pLock)
{
	int retval;
	retval=*pLock;
	*pLock=1;		
	return retval;	//实际上每次返回的是pLock的值(传进来的值,未改变之前)。
}
void enter_region()
{
	while(TSL(&lok)){};
}
void leave_region()
{
	lock=0;
}
int main()
{
	enter_region();
	<critical section>
	leave_region();
	<non_critical section>
	
}

四 swap指令实现互斥

#include<iostream>
using namespace std;
int lock=0;
void swap(int *a,int *b)
{
	int temp=0;
	temp=*a;
	*a=*b;
	*b=temp;
}

void enter_region()
{
	int key=1;
	while(key==1)
		swap(swap(&key,&lock));
}
void leave_region()
{
	lock=0;
}
int main()
{
	enter_region();
	<critical section>
	leave_region();
	<non_critical section>
	
}

五 CAS指令实现互斥(compare and swap)

#include<iostream>
using namespace std;
int lock=0;
int CAS(int *value,int expected,int new_value)
{
	int temp=*value;
	if(*value==expected)
	{
		*value=new_value;
	}
	return temp;
}
void enter_region()
{
	while(CAS(&lock,0,1));
}
void leave_region(){
	lock=0;
}
int main()
{
	enter_region();
	<critical section>
	leave_region();
	<non_critical section>
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值