2016-11-30 4 views
0

Ich habe eine schwere Zeit, dieses Hausaufgabenproblem zu lösen. Ruft das Aufrufen von x.signal() in einem Thread und später von x.wait() in einem anderen Thread ein anderes Ergebnis auf, wenn x eine Zustandsvariable ist und wenn x ein Semaphor ist?Bedingung Variable vs Semaphor Beispiel

Meine Vermutung ist, dass es in diesem speziellen Fall keine Rolle spielt, ob x eine Zustandsvariable oder ein Semaphor ist.

Vielen Dank für Ihre Hilfe!

Antwort

0

Semaphore hat einen durch atomare Operationen geschützten Zustand, während die Zustandsvariable (CV) keinen eigenen Zustand hat und nicht einmal geschützt ist (die übliche Annahme ist, dass das Programm einen eigenen, komplizierteren gemeinsamen Zustand als nur ein Integer und muss daher "manuell" beibehalten werden.

Die korrekte Verwendung von CV erfordert, dass sowohl Signal- als auch Wartevorgänge geschützt sind (umgeben von der zugehörigen Mutex-Verriegelung), andernfalls könnte der wartende Thread die Signalisierung verpassen. Das Programm muss also sicherstellen, dass die CVs korrekt synchronisiert sind.

Inzwischen Semaphore Operationen sind vom Entwickler versteckt, und der Code ist einfacher und kann nicht in der Art und Weise gehen CVs können, aber es hält auch sehr einfach/klein gemeinsamen Zustand mit sehr spezifischen Operationen.

+0

[Sie können ein Semaphor aus einem Mutex und einer Bedingungsvariablen erstellen] (http://stackoverflow.com/a/4793662/412080). Beide können gemeinsam genutzt und im gemeinsamen Speicher abgelegt werden, wodurch ein prozessübergreifender Kommunikationsmechanismus bereitgestellt wird. –

+0

@MaximEgorushkin sicher, können Sie eine andere (es ist eine Leistung Overkill) bauen, aber ich würde gerne Standard/native CV mit IPC, z. Ich sehe keine solche Option in pthread_cond_init. – mariusm

+1

Prozess freigegebene Mutexe und Zustandsvariablen sind seit Jahrzehnten Standard. http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_setpshared.html –