讨论/《硬核操作系统指南》 - 忙等互斥/
《硬核操作系统指南》 - 忙等互斥
共 5 个回复

严格轮询的代码写错了吧,三行代码不在内层while循环里

4

赞同,应该是下面这种:
进程0:

while(TRUE) {    
    while(turn != 0);    
    critical_region();    
    turn = 1;   
    noncritical_region();
}

进程1:

while(TRUE) {   
    while(turn != 1);    
    critical_region();    
    turn = 0;    
    noncritical_region();
}

希望作者看一下,是否真的有误。

1

进程 0 的代码

while(TRUE){
  while(turn != 0){
    /* 进入关键区域 */
    critical_region();
    turn = 1;
    /* 离开关键区域 */
    noncritical_region();
  }
}

进程 1 的代码

while(TRUE){
  while(turn != 1){
    critical_region();
    turn = 0;
    noncritical_region();
  }
}

在上面代码中,变量 turn,初始值为 0 ,用于记录轮到那个进程进入临界区,并检查或更新共享内存。开始时,进程 0 检查 turn,发现其值为 0 ,于是进入临界区。进程 1 也发现其值为 0 ,所以在一个等待循环中不停的测试 turn,看其值何时变为 1

我怎么感觉turn = 1时进程 0 才进入临界区;turn = 0时进程 1才进入临界区,是我感觉错了吗?

TSL做法可行,锁变量做法不可行,是因为可以一条指令完成读值和赋值的操作吗?

连接没了