互斥:软件方法实现之Peterson算法
2008-10-15 16:34
316 查看
互斥:软件方法实现之Peterson算法
德国数学家Dekker曾提出了两个进程互斥的算法,不过Dekker算法过于复杂。而Peterson提出了简单且一流的方法。
实现如下:
boolean flag[2];
int turn;
void P0()
{
while(true)
{
flag[0]=true;
turn=1;
while(flag[1]&&turn==1)
/* donothing*/ ;
/*critical section*/ ;
flag[0]=false;
}
}
void P1()
{
while(true)
{
flag[1]=true;
turn=0;
while(flag[0]&&turn==0)
/* donothing*/ ;
/*critical section*/ ;
flag[1]=false;
}
}
void main()
{
flag[0]=flag[1]=false;
/*start p0 and p1*/ ;
}
说明:
考虑进程P0,一旦它设置flag[0]=true,则P1不能进入临界区。如果P1已经进入临界区,那么flag[1]=true,P0被阻塞不能进入临界区。
另一方面,互相阻塞也避免了。假设P0在while里被阻塞了,表示flag[1]为true且turn=1,则此时P1可以执行。
德国数学家Dekker曾提出了两个进程互斥的算法,不过Dekker算法过于复杂。而Peterson提出了简单且一流的方法。
实现如下:
boolean flag[2];
int turn;
void P0()
{
while(true)
{
flag[0]=true;
turn=1;
while(flag[1]&&turn==1)
/* donothing*/ ;
/*critical section*/ ;
flag[0]=false;
}
}
void P1()
{
while(true)
{
flag[1]=true;
turn=0;
while(flag[0]&&turn==0)
/* donothing*/ ;
/*critical section*/ ;
flag[1]=false;
}
}
void main()
{
flag[0]=flag[1]=false;
/*start p0 and p1*/ ;
}
说明:
考虑进程P0,一旦它设置flag[0]=true,则P1不能进入临界区。如果P1已经进入临界区,那么flag[1]=true,P0被阻塞不能进入临界区。
另一方面,互相阻塞也避免了。假设P0在while里被阻塞了,表示flag[1]为true且turn=1,则此时P1可以执行。
相关文章推荐
- 互斥:软件方法实现之Peterson算法
- 互斥:软件方法实现之Peterson算法
- Peterson算法(软件实现互斥)
- 软件实现临界区互斥的方法总结思考(四种算法的递进推导)
- 互斥的软件实现:Peterson算法和Dekker算法
- synchronized 修饰的方法无法实现互斥的问题解决
- 《软件工程 ——理论、方法与实践》知识概括第九章 软件实现
- Delphi实现限定软件使用时间的方法
- .NET平台下基于webservice,通过获取硬件cpu序列号和随机字符串序列号实现软件加密的一种方法。
- 在C#中实现软件自动升级(方法2)
- 实现程序互斥运行的几种方法
- bash实现互斥、信号量的方法
- 实现软件滤波方法及其示例程序
- 多线程实现互斥访问对象的方法
- windows中使用Findwindow函数与FindWindowEx函数来实现自动控制、触发第三方软件事件的方法
- SoC嵌入式软件架构设计II:没有MMU的CPU虚拟内存管理的设计和实现方法
- 采用C#实现软件自动更新的方法
- 多线程同步和互斥的实现方法
- 20120822-[转]单片机实现软件复位(软复位)的方法及讨论
- 采用C#实现软件自动更新的方法