1

好的,我正在阅读 galvin 第六版的关键部分问题。问题是,问题中使用的算法有一个while循环:

do
  {
   while(turn!=i);
   critical section
   turn=j;
    remainder section
}while(1);

最初 turn==0 并且对于 i=0,进程 p0 运行它的关键问题。 对于这种特殊情况,while(turn!=i);评估为。while(false)

现在我的问题是,如果 while 循环评估为 false,那么如何评估以下关键部分。愚蠢的部分来了,如果出于任何原因while(turn!=i); 如果有分号,那么以下语句对 while 循环没有影响!那么,这里的while循环有什么用!?:|

4

2 回答 2

2

在这种情况下,while 循环要么无限循环,要么什么都不做。带有分号的 while 循环指定它应该尝试循环,但在 while 块中不执行任何指令。写作while (1);相当于while (1) {}

这种语法的一个常见用法是当你只想迭代,比如说,直到字符串的结尾,以进一步工作。你会写类似

char *work_on_end_of_string(char *str) {
  int i = 0;

  while (str[i++]); 
  // now str[i] is pointing on the end of the string
}

在您的情况下,正如您提到的那样,您的程序是多线程的,turn或者i在执行关键部分之前似乎需要有所不同。while 语句可以循环测试这个条件,直到一个线程修改其中一个以满足它。

于 2012-10-13T08:54:45.967 回答
1

如果 while 循环中的条件为假,则进程 P0 的关键部分将执行,如果条件为真,则 while 循环迭代(认为它是进程 P0 进入睡眠状态)直到 turn 的值被另一个更改当前正在运行其关键部分的进程。

于 2012-10-13T09:15:00.163 回答