Dekker 算法经过很多版本的改进才是最终的样子,它的初版是这样的
/*PROCESS 0*/
…
while(flag[1]); flag[0]=true;
临界区
flag[0]=false;
…
/*PROCESS 1*/
…
while(flag[0]);
flag[1]=true;
临界区
flag[1]=false;
…
上述算法实现了忙则等待:当P0在临界区中时,turn值为0,只有P0出临界区后,将turn值修改为1,P1才能进入自己的临界区。但违背了空闲则入:若P0停在while判断之前的位置,而此时turn值又为0,则P1不能进入临界区。这就意味着,如果一个进程运行失败,另一个进程也将永久被阻止。
改进如下
/*PROCESS 0*/
…
while(flag[1]);
flag[0]=true;
临界区
flag[0]=false;
…
/*PROCESS 1*/
…
while(flag[0]);
flag[1]=true;
临界区
flag[1]=false;
…
资料上说违背忙则等待:flag[0]和flag[1]都为false时,两进程都可以进入临界区。但是1在进入临界区前已经把fala[0]置为true了啊;是按照while(flag[1]); while(flag[0]);flag[0]=true;flag[1]=true;的顺序执行时会违背忙则等待吗?
还有违背空闲则入:flag[0]和flag[1]初值都为true时,两进程都不能进入临界区。也是按照while(flag[1]); while(flag[0]);的顺序执行?