Maison > développement back-end > Golang > le corps du texte

Comment un multiplexeur Go peut-il garantir un accès équitable et sûr sur plusieurs canaux d'entrée ?

Patricia Arquette
Libérer: 2024-11-23 09:12:23
original
557 Les gens l'ont consulté

How Can a Go Multiplexer Ensure Fair and Safe Access Across Multiple Input Channels?

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)
}
Copier après la connexion

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)
}()
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal