Ceci est faux:
func e6() {
c1 := make(chan struct{}, 1)
<-c1
go func() {
c1 <- struct{}{}
}()
}
, car l'exécution va dans une impasse. En appelant <-c1
dans le thread de la fonction principale, vous bloquez une réception à partir d'un canal ouvert. Receive bloquera jusqu'à ce qu'il reçoive des données de c1
mais aucun processus n'envoie de données dessus. Le goroutine qui est supposé envoyer c1
n'a pas encore démarré depuis que l'exécution du code a été bloquée avant d'atteindre l'instruction go
.
Dans la mise en œuvre correcte:
func e6() {
c1 := make(chan struct{}, 1)
go func() { //statement1
c1 <- struct{}{}
}()
<-c1 //statement2
}
n'a pas d'importance qui se dirige d'abord la déclaration. Si statement1
s'exécute en premier, le goroutine (s'exécutant dans un thread différent) bloque l'envoi c1
(c1 <- struct{}{}
) car statement2
n'a pas encore été exécuté et aucun autre processus ne reçoit de données de c1
. Cela entraîne l'exécution de l'exécution du goroutine et de l'exécution du goroutin dans le thread de la fonction principale où statement2
s'exécutera (rappelez-vous que l'instruction go
ne bloque généralement pas). Cette fois statement2
ne bloquera pas car un autre processus (statement1
) est déjà prêt avec les données à envoyer c1
. Ainsi, les deux threads continuent à l'achèvement.
Un raisonnement similaire peut être fait pour le cas dans lequel statement2
s'exécute en premier.
Merci beaucoup. –