Frage

ich bin nicht sicher über etwas.

Wenn ich CRITICAL_SECTION / Mutex / semaphor in C ++ zum Beispiel, wie funktioniert das busy_wait Problem verhindert werden?

Was ich meine ist, wenn ein Thread einen kritischen Abschnitt erreicht, und der kritische Abschnitt wird von anderem Thread belegt, was verhindert, dass der Faden von Zykluszeit zu verschwenden und wartet auf nichts?

zum Beispiel, soll ich TryEnterCriticalSection und die Prüfung nennen, wenn der Thread Eigentum erhalten und ansonsten Anruf Schlaf (0)?

Ich bin ein bisschen perplex

Dank

War es hilfreich?

Lösung

Dies ist Windows-spezifisch, sondern Linux wird ähnlich sein.

hat Windows das Konzept einer Bereitschafts-Warteschlange von Threads. Dies sind Themen, die betriebsbereit sind, und werden zu einem bestimmten Zeitpunkt an einem verfügbaren Prozessor ausgeführt werden sollen. Welche Themen werden ausgewählt sofort ausgeführt wird, ein wenig kompliziert -. Threads unterschiedliche Prioritäten haben, können ihre Prioritäten vorübergehend angehoben werden, usw.

Wenn ein Thread wartet auf einem Synchronisations primitiv wie ein CRITICAL_SECTION oder Mutex, ist es nicht auf der Bereitschaftswarteschlange platziert - Windows wird nicht einmal versuchen, den Faden zu laufen und andere Threads ausgeführt werden, wenn möglich. Irgendwann wird der Faden zurück in die Bereitschafts-Warteschlange bewegt werden, zum Beispiel wenn der Thread der CS oder Mutex freigibt zu besitzen.

Andere Tipps

Der Faden wird keine Systemressourcen zu nehmen, weil sie als „warten“ markiert werden. Sobald der Faden der kritische Region beendet einnimmt, wird es ein Signal aussenden, dass die Warte Thread zu der Bereitschaftswarteschlange bewegen wird.

Diese Kontrollstrukturen stoppen Sie den Faden, den es in dem Schlaf ein Besetztwarte zu tun, indem sie nicht eintreten kann, bis eine Unterbrechung durch den Thread erzeugt wird, die in der kritischen Abschnitt Finishing Ausführung ist. Weil der Faden schläft sie nicht unter Verwendung von Prozessorzyklen, so dass keine busy_wait.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top