关于 peterson 方法完成进程互斥的疑问

C语言 码拜 8年前 (2016-09-21) 990次浏览
在《现代操作系统》这本书中,本人有看到作者给出的一个案例,指出了能够使用 peterson 方法完成进程互斥。为了能够描述出本人的问题,本人把代码贴出来:
#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) // 进程:谁离开?
{
interested[process] = FALSE; //表明离开临界区
}
假设进程 0 先进入 enter_region ,然后在执行完 turn==process 这个操作之后就被调度程序切换了,换成了进程 1 开始执行 entry_region 过程,然后在进程 1 执行完 turn==process 之后又被调度程序切换为进程 0 ,然后进程 0 进入 while 死循环,切换到进程 1 后,进程 1 也进入 while 死循环,这样不就陷入了死锁了吗?
其实说了这么多,本人认为关键问题就是:执行完 turn==process 这个操作之后,会不会被调度程序切换掉?
希望大家帮忙解惑~~
解决方案

15

你这peterson反了。peterson应该是interested[other] == TRUE && turn == process。

15

顺便补充,你的理解完全没有问题。进程切换的确会发生在任何点,包括&&上。会出问题是原因是它那代码写错了。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于 peterson 方法完成进程互斥的疑问
喜欢 (0)
[1034331897@qq.com]
分享 (0)