Maison >développement back-end >Golang >La fermeture du canal Golang forcera-t-elle également la synchronisation des goroutines ?

La fermeture du canal Golang forcera-t-elle également la synchronisation des goroutines ?

WBOY
WBOYavant
2024-02-09 20:15:31467parcourir

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

L'éditeur PHP Xigua est là pour répondre à une question sur les chaînes Golang : la fermeture des chaînes Golang forcera-t-elle également la synchronisation des goroutines ? Normalement, la fermeture du canal ne force pas la goroutine à se synchroniser, mais la fermeture du canal déclenche une opération de lecture sur le canal pour renvoyer une valeur nulle et une valeur booléenne. S'il y a des données non lues dans le canal, l'opération de lecture renverra data et true ; s'il n'y a pas de données non lues dans le canal, l'opération de lecture renverra zéro et false. Par conséquent, après avoir fermé le canal, vous pouvez déterminer si toutes les données du canal ont été lues en lisant le canal.

Contenu de la question

Comme indiqué dans le livre "Go Programming Language" (page 226) :

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.

La même chose se produira-t-elle si la chaîne est fermée ? Je veux dire, la réception de la fermeture d'une chaîne se produit-elle toujours avant que la goroutine qui vient de la fermer ne se réveille à nouveau ?

Je me souviens avoir lu quelque chose à ce sujet. J'ai cherché dans les livres mais je n'ai pas trouvé.

Solution de contournement

La fermeture du canal ne force pas la goroutine à se synchroniser comme l'envoi sur un canal sans tampon.

Go Memory ModelSpécification dit :

L'appel de la goroutine close() ne bloquera pas l'attente qu'une autre goroutine reçoive une valeur nulle.

Un Goroutine envoyant une valeur à un canal non tamponné se bloque jusqu'à ce qu'un autre Goroutine reçoive la valeur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer