2010-03-27 10 views
15

Hier ist die typische Art und Weise eine Zustandsgröße zu verwenden:Benötigen Bedingungsvariablen immer noch einen Mutex, wenn Sie den überprüften Wert atomar ändern?

// The reader(s) 
lock(some_mutex); 
if(protected_by_mutex_var != desired_value) 
    some_condition.wait(some_mutex); 
unlock(some_mutex); 

// The writer 
lock(some_mutex); 
protected_by_mutex_var = desired_value; 
unlock(some_mutex); 
some_condition.notify_all(); 

Aber wenn protected_by_mutex_var von etwa atomar festgelegt ist, eine Vergleichs- und Swap-Anweisung, wird der Mutex dient gegenstandslos (ausgenommen pThreads und andere APIs erfordern, dass Sie einen Mutex übergeben)? Ist es der Schutzzustand, der verwendet wird, um die Bedingung zu implementieren? Wenn nicht, ist es sicher, dann ist diese

// The writer 
atomic_set(protected_by_mutex_var, desired_value); 
some_condition.notify_all(); 

Mit dem Schriftsteller nie mit dem Leser der Mutex direkt in Wechselwirkung zu tun ?:? Beachten Sie, dass der Name 'protected_by_mutex_var' nicht mehr wirklich angemessen ist (es ist nicht mehr Mutex-geschützt). Wenn ja, ist es sogar notwendig, dass verschiedene Leser den gleichen Mutex verwenden?

+1

Der ganze Sinn der Zustandsvariablen ist, dass sie „prüfen das Prädikat, schalte den Mutex zu machen, und schlaf "atomar. –

Antwort

14

Stellen Sie sich folgendes Szenario vor:

| Thread 1           | Thread 2           | 
| if(protected_by_mutex_var != desired_value) -> true |             | 
|              | atomic_set(protected_by_mutex_var, desired_value); | 
|              | some_condition.notify_all();      | 
| some_condition.wait(some_mutex);     |             | 

Diese Situation Thread 1 wartet sieht für eine, die nie kommen benachrichtigen kann. Da die Anweisungen, die auf die Bedingung einwirken, nicht Teil der Variablen read/atomic set sind, stellt dies eine Race-Bedingung dar.

Mit der Mutex effektiv diese Maßnahmen untrennbar macht (vorausgesetzt, alle auf die Variable zugreift richtig den Mutex verhalten und verriegeln.)

+0

Natürlich: p Warten auf Bedingungen verhält sich nicht wie poll(). –

+0

* "Da die auf die Bedingung einwirkenden Anweisungen nicht Teil der Variablen read/atomic set sind, stellt dies eine Race Condition dar." * Würden Sie diese Aussage bitte noch einmal im Detail erklären? –

+0

@Anisha Kaul: Betrachten wir den Lesercode für jetzt. In diesem Fall ist die Anweisung, die auf die Bedingung einwirkt, "some_condition.wait (some_mutex)" und die gelesene Variable ist in "if (protected_by_mutex_var! = Sined_value)". Alles, was ich sagen will, ist, dass nichts garantiert, dass ein anderer Thread nicht zwischen diesen beiden Operationen unterbricht - sie sind nicht "zusammen"/"atomar"; oder wie ich es früher gesagt habe, ist das Warten nicht "Teil von" der gelesenen Variablen. Ähnlich für den Writer-Thread, für den Aufruf atomic_set und den Aufruf some_condition.notify_all(). –