Was sind die Prinzipien einer Zustandsvariablen bei der Synchronisierung der Prozesse von Betriebssystemen?
Antwort
Zu viele Anzeigen?Nun, bedingte Variablen ermöglichen es Ihnen, auf das Eintreten einer bestimmten Bedingung zu warten. In der Praxis kann Ihr Thread auf der bedingten Variable schlafen und ein anderer Thread weckt ihn auf.
Bedingte Variable kommt auch in der Regel mit Mutex. Damit können Sie das folgende Synchronisationsproblem lösen: Wie können Sie den Zustand einer durch Mutex geschützten Datenstruktur überprüfen und dann warten, bis sich der Zustand zu etwas anderem ändert. D.h..
/* in thread 1 */
pthread_mutex_lock(mx); /* protecting state access */
while (state != GOOD) {
pthread_mutex_unlock(mx);
wait_for_event();
pthread_mutex_lock(mx);
}
pthread_mutex_unlock(mx);
/* in thread 2 */
pthread_mutex_lock(mx); /* protecting state access */
state = GOOD;
pthread_mutex_unlock(mx);
signal_event(); /* expecting to wake thread 1 up */
Dieses Pseudocode-Beispiel enthält einen Fehler. Was passiert, wenn der Scheduler beschließt, den Kontext von Thread 1 zu Thread 2 zu wechseln, nachdem pthread_mutex_unlock(mx), aber vor wait_for_event(). In diesem Fall wird Thread 2 Thread 1 nicht aufwecken und Thread 1 wird weiter schlafen, möglicherweise für immer.
Die bedingte Variable löst dieses Problem, indem sie den Mutex vor dem Schlafengehen atomar entsperrt und nach dem Aufwachen atomar sperrt. Ein funktionierender Code sieht wie folgt aus:
/* in thread 1 */
pthread_mutex_lock(mx); /* protecting state access */
while (state != GOOD) {
pthread_cond_wait(cond, mx); /* unlocks the mutex and sleeps, then locks it back */
}
pthread_mutex_unlock(mx);
/* in thread 2 */
pthread_mutex_lock(mx); /* protecting state access */
state = GOOD;
pthread_cond_signal(cond); /* expecting to wake thread 1 up */
pthread_mutex_unlock(mx);
Ich hoffe, es hilft.