互斥的软件实现:Peterson算法和Dekker算法

Peterson算法:是一个实现互斥锁的并发程序设计算法,可以控制两个线程访问一个共享的单用户资源而不发生访问冲突。
算法代码及注释如下:

bool flag[2];			//表示临界区状态及哪个进程正在占用临界区
int turn;   			//表示能进入临界区的进程序号

void P0()
{
	while (1)
	{
		flag[0] = true;			//P0请求资源
		turn = 1;			//赋予P0访问权限
		while (flag[1] && turn == 1);	//等待进程P1释放资源及权限
		//请求成功,使用资源
		/*
		临界区代码段
		*/
		flag[0] = false;		//释放请求
	}
}

void P1()			//原理及注释同P0
{
	while (1)
	{
		flag[1] = true;
		turn = 0;
		while (flag[0] && turn == 0);
		//请求成功,使用资源
		/*
		临界区代码段
		*/
		flag[1] = false;
	}
}

Peterson算法满足互斥、空闲让进。有限等待3条同步机制准则。

Dekker互斥算法:解决并发进程互斥与同步的软件实现方法。

算法代码及注释如下:

bool flag[2];//表示临界区状态及哪个进程想要占用临界区
int turn;   //表示能进入临界区的进程序号

void P0()
{
	while (1)
	{	
		flag[0] = true;				//P0请求使用资源
		while (flag[1])				//查询P1是否在使用资源
		{
			if (turn == 1)			//查询P1是否具有权限进入临界区
			{
				flag[0] = false;	//如果P1有权限则P0取消请求
				while (turn == 1);	//等待P1释放资源
				flag[0] = true;		//继续请求
			}
			//请求成功,使用资源
			/*
			临界区代码段
			*/
			turn = 1;			//使用完成后把权限赋给P1
			flag[0] = false;
		}
	}
}

void P1()						//原理及注释同P0
{
{
	while (1)
	{
		flag[1] = true;
		while (flag[0])
		{
			if (turn == 0)
			{
				flag[1] = false;
				while (turn == 0);
				flag[1] = true;
			}
		//请求成功,使用资源
		/*
		临界区代码段
		*/
		turn = 0;
		flag[1] = false;
		}
	}
}


Peterson算法比Dekker算法更简单一些。


 

你可能感兴趣的:(操作系统,算法,操作系统,算法)