Maison  >  Article  >  développement back-end  >  Les sémaphores peuvent-ils émuler le verrouillage tamponné dans Go ?

Les sémaphores peuvent-ils émuler le verrouillage tamponné dans Go ?

DDD
DDDoriginal
2024-11-14 18:37:02240parcourir

Can Semaphores Emulate Buffered Locking in Go?

Modèles de verrouillage tamponnés

Dans Go, le concept de canal tamponné permet des opérations non bloquantes jusqu'à ce que le tampon du canal soit rempli. Inspirée par ce mécanisme, la question se pose : existe-t-il un modèle généralisé semblable aux canaux tamponnés pour le « verrouillage tamponné », où une ressource peut être verrouillée pour un ensemble fini de clients ?

Réponse : sémaphores

La primitive qui remplit cette exigence est un sémaphore. Construit avec un canal tamponné, un sémaphore impose une limite au nombre de clients simultanés pouvant accéder à une ressource.

Considérez l'implémentation suivante utilisant un canal tamponné :

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

Dans ce scénario , la fonction f acquiert le verrou en envoyant une valeur dans le canal sémaphore. Si le canal est plein, ce qui représente la concurrence maximale autorisée, f se bloque jusqu'à ce qu'un autre client libère le verrou en recevant une valeur du canal. L'instruction defer garantit que le verrou est libéré au retour de la fonction.

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