Heim  >  Artikel  >  Backend-Entwicklung  >  Wird das Schließen des Golang-Kanals auch die Goroutine-Synchronisierung erzwingen?

Wird das Schließen des Golang-Kanals auch die Goroutine-Synchronisierung erzwingen?

WBOY
WBOYnach vorne
2024-02-09 20:15:31436Durchsuche

关闭 golang 通道是否也会强制 goroutine 同步?

PHP-Redakteur Xigua ist hier, um eine Frage zu Golang-Kanälen zu beantworten: Wird das Schließen von Golang-Kanälen auch die Goroutine-Synchronisierung erzwingen? Normalerweise erzwingt das Schließen des Kanals keine Synchronisierung der Goroutine, aber das Schließen des Kanals löst einen Lesevorgang auf dem Kanal aus, um einen Nullwert und einen booleschen Wert zurückzugeben. Wenn im Kanal ungelesene Daten vorhanden sind, gibt der Lesevorgang Daten und „true“ zurück. Wenn im Kanal keine ungelesenen Daten vorhanden sind, gibt der Lesevorgang „Null“ und „false“ zurück. Daher können Sie nach dem Schließen des Kanals feststellen, ob alle Daten im Kanal gelesen wurden, indem Sie den Kanal lesen.

Frageninhalt

Wie im Buch „Go Programming Language“ (Seite 226) angegeben:

Communication over an unbuffered channel causes the sending and receiving goroutines to synchronize. Because of this, unbuffered channels are sometimes called synchronous channels. When a value is sent on an unbuffered channel, the receipt of the value happens before the reawakening of the sending goroutine.

Wird das Gleiche passieren, wenn der Kanal geschlossen ist? Ich meine, erfolgt der Empfang des Schließens eines Kanals immer, bevor die Goroutine, die ihn gerade geschlossen hat, wieder aufwacht?

Ich erinnere mich, etwas dazu gelesen zu haben. Ich habe in Büchern gesucht, konnte es aber nicht finden.

Workaround

Das Schließen des Kanals zwingt die Goroutine nicht zur Synchronisierung, wie das Senden auf einem ungepufferten Kanal.

Go-SpeichermodellSpezifikation besagt:

Der Goroutine-Aufruf close() blockiert nicht das Warten darauf, dass eine andere Goroutine einen Nullwert empfängt.

Eine Goroutine, die einen Wert an einen ungepufferten Kanal sendet, blockiert, bis eine andere Goroutine den Wert empfängt.

Das obige ist der detaillierte Inhalt vonWird das Schließen des Golang-Kanals auch die Goroutine-Synchronisierung erzwingen?. 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