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

Les canaux tamponnés peuvent-ils être utilisés pour implémenter le verrouillage tamponné dans Go ?

Susan Sarandon
Libérer: 2024-11-16 22:39:03
original
690 Les gens l'ont consulté

Can Buffered Channels Be Used for Implementing Buffered Locking in Go?

Verrouillage tamponné en Go

En Go, les canaux tamponnés permettent la communication sans blocage jusqu'à ce que le tampon soit plein. Cela soulève la question : existe-t-il un modèle général de verrouillage tamponné, où une ressource est verrouillée pour un nombre limité de clients ?

Réponse : Sémaphores

La primitive pour verrouiller une ressource pour un nombre limité de clients est un sémaphore. Un sémaphore est facilement implémenté à l'aide d'un canal tamponné.

Considérez l'exemple suivant :

var semaphore = make(chan struct{}, 4) // allow four concurrent users

func f() {
    // Grab the lock. Blocks as long as 4 other invocations of f are still running.
    semaphore <- struct{}{}

    // Release the lock once we're done.
    defer func() { <-semaphore }()

    // Do work...
}
Copier après la connexion

Dans cet exemple, le canal tamponné avec quatre éléments (make(chan struct{}, 4) ) fait office de sémaphore. La fonction f saisit le verrou en envoyant une valeur au canal. Si le canal est plein, la fonction se bloquera jusqu'à ce qu'une valeur soit reçue. Une fois le verrou acquis, l'instruction defer garantit que le verrou est libéré au retour de la fonction.

En utilisant des sémaphores implémentés avec des canaux tamponnés, vous pouvez créer des modèles de verrouillage tamponnés qui restreignent l'accès à une ressource à un nombre limité. d'utilisateurs simultanés.

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