2009-11-06 62 views
0

爲什麼在進程0的第一個入口處進行嚴格的交替測試(turn == 0)//然後輸入 如何處理0進入while(turn != 0),是不是和while一樣(turn == 1)?C編程語言嚴格交替(來自Tanenbaum)

turn = 0; 
//process 0 to enter 
while (TRUE) { 
    while (turn != 0) 
    critical_region(); 
    turn = 1; 
    noncritical_region(); 
} 

//process 1 to enter 
while (TRUE) { 
    while (turn != 1) 
    critical_region(); 
    turn = 0; 
    noncritical_region(); 
} 

回答

3

首先,你的代碼錯誤。的Tanenbaum嚴格的交替看起來像這樣(他的例子都寫不使用塊,但我認爲這是容易按照這種方式):

while (TRUE) { 
    while (turn != 0) 
    { 
     /* do nothing */ 
    } 
    critical_region(); 
    turn = 1; 
    noncritical_region(); 
} 

嚴格交替的想法是雙重的:

  1. 在任何在一個進程0運行critical_region()之前,它必須等待進程1在運行critical_region()之前運行critical_region(),然後才能執行critical_region()函數。被允許再次運行)。
1

如果展開你貼有括號中的代碼,它看起來像這樣:

turn = 0; 
//process 0 to enter 
while (TRUE) 
{ 
    while (turn != 0) 
    { 
     critical_region(); 
    } 
    turn = 1; 
    noncritical_region(); 
} 

所以你進入主循環的第一次,它設置turn爲1,並調用noncritical_region。第二次它呼籲critical_region大概呆在那裏。

0

我懷疑正確的代碼是:

turn = 0; 
//process 0 to enter 
while (TRUE) { 
    while (turn != 0) critical_region(); 
    turn = 1; 
    noncritical_region(); 
} 

//process 1 to enter 
while (TRUE) { 
    while (turn != 1) critical_region(); 
    turn = 0; 
    noncritical_region(); 
} 
1

我覺得代碼實際上是這樣的

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

注意的是,在本書中的分號的意見後/ *循環* /內一段時間後寫在那裏。