Un multiplexeur de canaux avec un accès égal
Ce multiplexeur Go vise à fusionner les sorties de plusieurs canaux en un seul, garantissant que chaque canal d'entrée a des droits égaux sur le canal de sortie. Cependant, le test fourni donne des résultats inattendus.
Analyse du problème
Le problème critique réside dans les goroutines générées par la fonction Mux. Le paramètre de canal c, destiné à représenter chaque canal d'entrée, est mis à jour à chaque itération de la boucle. Cela signifie que toutes les goroutines finissent par tirer du même canal au lieu de leurs canaux individuels prévus.
Solution
Pour résoudre ce problème, modifiez la boucle de création de goroutine pour passer le bon canal à chaque goroutine :
for _, c := range channels { go func(c <-chan big.Int) { ... }(c) }
En faisant cela, chaque goroutine capture la valeur du canal lors de sa création, éliminer le problème et produire les résultats souhaités.
Améliorer la sécurité de la concurrence
En plus d'assurer l'égalité d'accès au canal de sortie, il est crucial d'assurer la sécurité de la concurrence. Le code initial utilise une variable int n pour suivre la fermeture des canaux d'entrée. Cependant, avec GOMAXPROCS supérieur à 1, il est possible que plusieurs goroutines accèdent à n simultanément, ce qui peut potentiellement provoquer des conditions de concurrence critique.
Une approche plus sûre consiste à utiliser un objet sync.WaitGroup, qui permet aux goroutines de s'attendre les unes les autres. et garantit que n est mis à jour en toute sécurité. Le code révisé utilisant un sync.WaitGroup :
import ( "math/big" "sync" ) // ... other code ... // The channel to output to. ch := make(chan big.Int, len(channels)) var wg sync.WaitGroup wg.Add(len(channels)) // ... other code ... // Close the channel when the pumping is finished. go func() { // Wait for everyone to be done. wg.Wait() // Close. close(ch) }()
Avec ces modifications, le multiplexeur fonctionne désormais correctement et en toute sécurité, garantissant que tous les canaux d'entrée ont un accès égal au canal de sortie et évitant les conditions de concurrence.
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!