Heim  >  Artikel  >  Backend-Entwicklung  >  Muss ich es vor der Übertragung entsperren?

Muss ich es vor der Übertragung entsperren?

王林
王林nach vorne
2024-02-14 20:30:10570Durchsuche

Muss ich es vor der Übertragung entsperren?

PHP-Redakteur Xiaoxin ist hier, um eine beliebte Frage für alle zu enthüllen: „Muss ich sie vor dem Senden entsperren?“ Auf diese Frage lautet die Antwort „Ja“. In der modernen Fernsehbranche sind in der Regel Entsperrvorgänge erforderlich, bevor Programme ausgestrahlt werden können. Denn die Entsperrung sorgt für eine sichere Übertragung der Programmsignale und verhindert wirksam unbefugtes Einsehen. Darüber hinaus kann die Entsperrung auch die legitimen Rechte und Interessen von Urheberrechten und Programminhalten schützen und der Mehrheit der Zuschauer ein qualitativ hochwertiges Seherlebnis bieten. Stellen Sie daher vor dem Ansehen einer Sendung sicher, dass der Entsperrvorgang abgeschlossen ist, um nicht spannende Inhalte zu verpassen.

Frageninhalt

Ich bin verwirrt über das Verhalten von Bedingungsvariablen in Go.

In der Haupt-Goroutine erhalte ich die Sperre und rufe Cond.Wait() in der for-Schleife auf, um den gemeinsam genutzten Speicher zu überprüfen. In der funktionierenden Goroutine erhalte ich die Sperre, ändere den gemeinsam genutzten Speicher und sende ihn dann.

Mir ist aufgefallen, dass Cond.Wait() 恢复时,它会在返回之前先尝试获取锁。但是, Cond.Broadcast() beim Fortsetzen versucht, die Sperre zu erlangen, bevor es zurückkehrt. Cond.Broadcast() hebt die Sperre jedoch nicht auf. Wenn ich die Sperre also vor der Übertragung nicht selbst aufhebe, sollte es dann nicht zu einem Deadlock kommen?

Ich habe Code mit sync.Cond gelesen und festgestellt, dass er nicht notwendig ist, weiß aber nicht warum. sync.Cond 阅读了一些代码,发现没有必要,但不知道为什么。

解决方法

修改共享变量时必须保持锁定。当一个goroutine调用Wait时,锁被解锁,因此另一个goroutine可以锁定它并修改共享变量。当您调用 Broadcast

Lösung

Gemeinsam genutzte Variablen müssen beim Ändern gesperrt bleiben. Wenn eine Goroutine Wait aufruft, wird die Sperre entsperrt, sodass eine andere Goroutine sie sperren und die gemeinsam genutzte Variable ändern kann. Die Goroutine kann die Sperre halten oder auch nicht, wenn Sie Broadcast aufrufen. Wenn die Goroutine die Sperre hält, werden die wartenden Goroutinen geweckt und warten, bis sie die Sperre erhalten können. Wenn Sie die Sperre aufheben, kann eine der wartenden Goroutinen die Sperre übernehmen und fortfahren. 🎜 🎜Nein, solange die Broadcast-Goroutine die Sperre schließlich aufhebt, wird es keinen Deadlock geben. 🎜

Das obige ist der detaillierte Inhalt vonMuss ich es vor der Übertragung entsperren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen