您的位置:首页 > 其它

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

2016-01-23 22:01 288 查看
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算法更简单一些。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  操作系统 算法