


Comment un multiplexeur Go peut-il garantir un accès équitable et sûr sur plusieurs canaux d'entrée ?
Nov 23, 2024 am 09:12 AMUn 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 :
1 2 3 4 5 |
|
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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement?

Comment écrire des objets et des talons simulés pour les tests en Go?

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego?

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO?

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go?

Comment écrire des fichiers dans GO Language de manière pratique?

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go?

Comment puis-je utiliser des liners et des outils d'analyse statique pour améliorer la qualité et la maintenabilité de mon code GO?
