Maison > développement back-end > Golang > Pouvez-vous créer un « verrou tamponné » dans Go ?

Pouvez-vous créer un « verrou tamponné » dans Go ?

Mary-Kate Olsen
Libérer: 2024-11-17 14:33:02
original
682 Les gens l'ont consulté

Can You Create a

Sémaphores : un modèle de verrouillage tamponné dans Go

Go introduit le concept de canaux tamponnés, permettant aux canaux d'accepter des messages sans se bloquer jusqu'à ce que le tampon soit rempli. Cela soulève la question : un modèle similaire peut-il être appliqué aux mécanismes de verrouillage, créant un « verrou tamponné » qui restreint l'accès aux ressources à un nombre spécifique de clients ?

La solution : les sémaphores

La primitive conçu pour gérer l'accès aux ressources partagées tout en limitant la concurrence des clients est connu sous le nom de sémaphore. Dans Go, les sémaphores peuvent être facilement implémentés à l'aide de canaux tamponnés.

Implémentation

Considérez l'extrait de code suivant :

var semaphore = make(chan struct{}, 4) // limit to 4 concurrent users

func f() {
    // Acquire the lock. Blocks until at most 3 other goroutines are already executing f.
    semaphore <- struct{}{}

    // Release the lock when done.
    defer func() { <-semaphore }()

    // Perform the protected work...
}
Copier après la connexion

Ici, le sémaphore est représenté par un canal tamponné. de taille 4, qui permet jusqu'à quatre appels simultanés de la fonction f. L'opération <-sémaphore récupère une valeur du canal, la bloquant jusqu'à ce qu'elle devienne disponible. L'opération <-sémaphore libère une valeur dans le canal, permettant à une autre goroutine d'acquérir le verrou.

Conclusion

Les sémaphores fournissent un mécanisme simple et efficace pour implémenter un verrouillage tamponné dans Go, permettant accès contrôlé aux ressources partagées par un nombre limité de clients.

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!

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