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
Mary-Kate Olsenoriginal
2024-11-17 14:33:02683parcourir

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...
}

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:
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