2015-09-12 13 views
5

Wenn Sie sich die Dokumentation anschauen, die die Verwendung von Bedingungsvariablen (cv) beschreibt, sehen Sie, dass z. In PThreads und C++ müssen Sie nicht den Mutex eines CV halten, um Notify auf diesem Lebenslauf anzurufen. Während z.B. In Java und Python müssen Sie den Mutex sperren, um dasselbe zu tun.Verwendung von Bedingungsvariablen in C/C++ und anderen Sprachen

Gibt es einen tiefen Grund, warum Dinge auf diese Weise implementiert werden (ich bin über den letzteren Fall), da eine Implementierung einer Sprache wie Java schließlich einige native Threading-Tools verwendet?

+0

Wahrscheinlich ist es nicht nur auf pthreads implementiert .. aber das ist nur eine Annahme. Ich denke, dass diese Frage auf http://cs.stackexchange.com/ ... besser werden könnte (oder sogar * alle *). –

+0

Offensichtlich könnte die JVM das so implementieren, aber es macht einen häufigen Fehler, den ich gesehen habe viele, viele Menschen tun in C++ viel weniger wahrscheinlich zu einem vernünftigen niedrigen Kosten (Sie müssen eine Sperre ein wenig länger halten, aber das ist es) – Voo

+0

@Voo Der Fehler ist, dass der Mutex nicht gehalten wird beim Ändern der Daten die Bedingung hängt davon ab? – vehsakul

Antwort

0

Die Java notify und notifyAll Grundsynchronisierungstools beide benötigen Sie auf dem Objekt zu synchronisieren, bevor sie aufgerufen wird. Dies ist für einen einfachen Sicherheitspunkt, da es auch erfordert, dass Sie auf sie vor wait ing synchronisieren.

Zum Beispiel, wenn Sie zwei Threads haben. Ein Thread liest Daten aus einem Puffer und ein Thread schreibt Daten in den Puffer.

Der Lese-Daten-Thread muss warten, bis der schreibende Daten-Thread einen Datenblock in den Puffer geschrieben hat, und dann kann er den Block lesen.

Wenn wait(), notify() und notifyAll() Methoden können ohne Synchronisation aufgerufen werden, dann können Sie eine Race-Bedingung, wo:

  • Der Lesefaden wait() ruft und der Faden Warteschlange hinzugefügt wird.

  • Zur gleichen Zeit ruft der Schreib-Thread auf, um zu signalisieren, dass er Daten hinzugefügt hat.

  • Der Lese-Thread verfehlt die Änderung und wartet für immer, da die notify() verarbeitet wurde, bevor die wait() war.

Durch die wait und notify zwingt innerhalb eines synchronisierten Block diese Race-Bedingung entfernt wird passieren.

Verwandte Themen