Maison > développement back-end > C++ > Une file d'attente tampon circulaire est-elle vraiment sans verrouillage si les opérations PUSH peuvent bloquer les opérations POP ?

Une file d'attente tampon circulaire est-elle vraiment sans verrouillage si les opérations PUSH peuvent bloquer les opérations POP ?

Linda Hamilton
Libérer: 2024-12-11 21:10:16
original
632 Les gens l'ont consulté

Is a Circular Buffer Queue Truly Lock-Free If PUSH Operations Can Block POP Operations?

Une file d'attente peut-elle être sans verrouillage si les opérations PUSH peuvent bloquer les opérations POP ?

De manière anecdotique, « sans verrouillage » est souvent utilisé à tort. pour signifier « programmation simultanée sans mutex ». Les algorithmes sans verrouillage fournissent en fait des garanties de progression quelles que soient les actions des autres threads. Cela signifie qu'il ne devrait y avoir aucun code dans lequel un thread dépend d'un autre pour continuer.

Considérez une file d'attente de tampon circulaire dans liblfds, qui vise la concurrence sans mutex explicites. L'algorithme PUSH consiste à réserver un emplacement en comparant l'index d'écriture et en mettant à jour le numéro de séquence. Bien qu'efficace avec un seul CAS, cela soulève des questions sur l'absence de verrouillage.

D'une part, les threads peuvent toujours être mis en file d'attente si des emplacements sont disponibles. Mais d'un autre côté, si une opération PUSH est interrompue avant la mise à jour du numéro de séquence, les opérations POP suivantes échoueront, faisant apparaître la file d'attente vide.

Selon la définition de l'absence de verrouillage comme « une structure est utilisable si tout thread est suspendu indéfiniment", cette file d'attente n'est pas strictement sans verrouillage. Il dispose d'un mécanisme mutex caché (l'index d'écriture et le numéro de séquence), dans lequel les rédacteurs peuvent ne pas parvenir à insérer des éléments en raison d'un rédacteur suspendu dans la région critique.

Cependant, la file d'attente peut toujours présenter certaines propriétés utiles. Il offre des performances raisonnables et non contestées en raison de sa faible surcharge, gère raisonnablement les performances contestées et est partiellement immunisé contre les changements de contexte. De plus, il prend en charge l'accès à la file d'attente à partir d'interruptions ou de signaux, bien qu'il ait des limites dans la gestion de la terminaison asynchrone des threads.

Bien que la file d'attente liblfds ne réponde pas entièrement à la définition stricte de l'absence de verrouillage, elle peut quand même être bénéfique pour certains candidatures. Il offre des garanties de progrès partielles et des caractéristiques de performance décentes, sans la complexité des solutions basées sur mutex.

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!

source:php.cn
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