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!