BBS水木清华站∶精华区
发信人: marmot (小土拨鼠), 信区: Unix
标 题: Re: 关于互斥的算法
发信站: BBS 水木清华站 (Fri Apr 23 09:28:27 1999) WWW-POST
【 在 katt (散户) 的大作中提到: 】
∶ #define FALSE 0
∶ #define TRUE 1
∶ #define N 2 /*进程数*/
∶ int turn; /*轮到谁了*/
∶ int interested[N]; /*所有值初始为FALSE*/
∶ void enter-region(int process) /*进程号为0或1*/
∶ {
∶ int other; /*另一个进程的进程号*/
∶ other = 1 - process; /*另一个进程*/
∶ interested[process] = TRUE; /*标识出希望进入临界区*/
∶ turn = process; /*设置标志位*/
∶ while(turn == process && interested[other] == TRUE); /*空语句*/
∶ }
∶ void leave-region(int process) /*process:即将离开临界区的进程*/
∶ {
∶ interested[process] = FALSE; /*标识将离开临界区*/
∶ }
∶ 以上一段为一个互斥进程的算法,但其中while一句的两个等号让我糊涂了,
∶ 谁能解释一下这个算法?
两个进程并发执行时,在同一时刻还是顺序的.
假如只用一个turn来标志,显然不够的,如果进程1先到,应该先看看turn,是不是没有进程
来执行,
然后再决定等待还是赋成自己的进程标志.万一在取出值后、保存值前,另一个进程也刚取
了turn的值,这就不能保证互斥了.
enter_region中,在执行while时,
如果interested[other]为false,表示第二个进程没来,他就进入临界区;
如果interested[other]被修改(变为true),turn还没有改,那么就等待,等待后来的进
程把turn改变时它(第一个进程)再进入临界区;
如果都改变了,第一个进程就直接进入临界区,后一个进程就处于等待状态。
当然了,这是用忙等来阻塞一个进程的。
--
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.118.6.141]
BBS水木清华站∶精华区