2010-12-11 7 views
0

Comment exactement l'ordre de linéarisation est-il déterminé. Comment peut-on dire que l'ordre de linéarisation du code suivant est l'ordre dans lequel libéré par wait(). Comment peut-on vérifier si le code est linéarisable?Détermination de l'ordre de linéarisation

class Buffer 
{ 
    int in = 0; 
    int out = 0; 
    int numElems = 0; 

    synchronized void put(E elem) throws InterruptedException 
    { 
     while (!numElems < N) 
     { 
      wait(); 
     } 
     buff[in] = elem; 
     in = (in + 1) % N; 
     notifyAll(); 
    } 

    synchronized E take() throws InterruptedException 
    { 
     while (!numElems > 0) 
     { 
      wait(); 
     } 
     E temp = buff[out]; 
     out = (out + 1) % N; 
     return temp; 
     notifyAll(); 
    } 
} 
+0

est-ce le formatage prévu? Est très difficile à lire. –

+0

a formaté le code. – devnull

Répondre

1

Il n'y a qu'une seule serrure ici (le verrou sur un objet spécifique Buffer), de sorte que l'ordre de linéarisation est juste l'ordre dans lequel ce verrou est acquis (ou libéré - il est le même ordre). Le verrou est toujours libéré à l'entrée wait et acquis à la sortie de wait, c'est pourquoi vous avez entendu parler de l'ordre de lancement wait dans ce contexte.

Je ne suis pas sûr de ce que vous entendez par "vérifier qu'il est linéarisable". Si vous voulez dire par là que toute exécution parallèle équivaut à une commande sérielle, alors c'est assez évident ici (bien que difficile en général) car tous les accès à la mémoire sont sous un seul verrou, donc il n'y a pas d'exécution parallèle.