Maison > Article > développement back-end > Existe-t-il un modèle de verrouillage tamponné dans Go similaire aux canaux tamponnés ?
Modèle de verrouillage tamponné dans Go
Dans Go, un canal tamponné permet à la communication de continuer sans blocage jusqu'à ce que son tampon se remplisse. Cependant, existe-t-il un modèle similaire pour mettre en mémoire tampon les verrous qui limitent l'accès aux ressources à un nombre spécifique de clients ?
La primitive permettant de gérer l'accès simultané à une ressource est le sémaphore. Un sémaphore peut être facilement implémenté à l'aide d'un canal tamponné.
Voici un exemple :
var semaphore = make(chan struct{}, 4) // allow four concurrent users func f() { // Grab the lock. Blocks if 4 other concurrent invocations of f are running. semaphore <- struct{}{} // Release the lock when the function is done. defer func() { <-semaphore }() // Perform the intended operations... }
Dans cet exemple, un sémaphore avec un tampon de taille 4 est créé en utilisant semaphore := make( chan struct{}, 4). La fonction f() tente d'acquérir le verrou en envoyant une structure vide au canal. Si le tampon du canal est plein (c'est-à-dire que 4 instances simultanées de f() sont déjà en cours d'exécution), l'appel au sémaphore <- struct{}{} se bloque jusqu'à ce qu'un verrou devienne disponible.
Lorsque la fonction se termine sa tâche, il libère le verrou en récupérant une structure vide du canal (-
Ce modèle constitue un moyen pratique de restreindre l'accès à une ressource partagée à un nombre spécifique de clients simultanés, évitant ainsi d'éventuels problèmes de conflit de ressources.
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!