2009-11-06 7 views
0

Pourquoi le test n'est pas en alternance stricte pour la première entrée pour le processus 0 while (tour == 0) // alors entrez Comment le processus 0 peut-il entrer while (tour ! = 0), n'est-ce pas la même chose que while (tour == 1)?Alternance stricte dans le langage de programmation C (de 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(); 
} 

Répondre

3

Tout d'abord, vous avez le mauvais code. une stricte alternance de Tanenbaum ressemble à ceci (son exemple sont écrits sans bloc, mais je pense qu'il est plus facile de suivre cette voie):

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

L'idée d'une stricte alternance est deux fois:

  1. A tout instantané dans le temps, un seul processus peut être l'exécution de la fonction critical_region()
  2. Les deux processus exécutent à leur tour critical_region() (ie une fois que le processus 0 exécute critical_region(), il doit attendre que le processus 1 exécute critical_region() avant être autorisé à le faire fonctionner à nouveau).
1

Si vous développez le code affiché avec des crochets, il ressemble à ceci:

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

La première fois que vous entrez dans la boucle principale, il définit turn-1 et demande noncritical_region. La deuxième fois, il appelle critical_region et reste probablement là.

0

Je soupçonne que le bon code est:

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

Je pense que le code est en fait comme celui-ci

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

Notez que dans le livre les points-virgules sont après les commentaires/* boucle */il écrit après le tout intérieur.

Questions connexes