lockfree
est un ensemble de structures de données sans verrouillage écrites en standard C++11 et adaptées à toutes les plates-formes - du profondément intégré au HPC.
Les structures de données sans verrouillage sont des structures de données qui sont sécurisées contre les threads et les interruptions pour une utilisation simultanée sans avoir à utiliser de mécanismes d'exclusion mutuelle. Ils sont particulièrement utiles pour la communication entre processus et s'adaptent souvent bien mieux que les structures basées sur des verrous en termes de nombre d'opérations et de threads.
lockfree
Ces structures de données sont plus performantes et doivent généralement être utilisées chaque fois qu'il n'y a qu'un seul thread/interruption poussant les données et un autre les récupérant.
Ces structures de données sont plus générales, prenant en charge plusieurs producteurs et consommateurs en même temps, mais elles entraînent une surcharge de stockage et de performances par rapport aux structures de données à producteur unique et à consommateur unique. Ils nécessitent également des instructions atomiques qui peuvent manquer dans certains microcontrôleurs bas de gamme.
Il existe trois manières principales d'obtenir la bibliothèque :
lockfree
utilise l'alignement de la ligne de cache pour les index afin d'éviter le phénomène de faux partage par défaut, évitant ainsi la perte de performances liée à l'invalidation de la ligne de cache sur les systèmes cohérents avec le cache. Cela aligne les index sur LOCKFREE_CACHELINE_LENGTH
, 64
par défaut.
Sur les systèmes embarqués, LOCKFREE_CACHE_COHERENT
doit presque toujours être défini sur false
pour éviter de gaspiller de la mémoire.
De plus, certains systèmes ont une longueur de cache non typique (par exemple, les processeurs Apple M1/M2 ont une longueur de cache de 128 octets), et LOCKFREE_CACHELINE_LENGTH
doit être défini en conséquence dans ces cas.
Toutes les structures de données de lockfree
sont uniquement destinées à être utilisées pour des types triviaux.
La principale raison pour laquelle vous souhaiteriez utiliser une structure de données sans verrouillage sur les environnements hébergés serait d'éviter les problèmes liés au verrouillage tels que les blocages, l'inversion de priorité et la latence d'accès non déterministe. Lorsqu'elles sont utilisées correctement, les structures de données sans verrouillage peuvent également améliorer les performances dans certains scénarios.
De plus, lockfree
fournit un moyen de créer des applications et des bibliothèques qui peuvent être compilées pour fonctionner à la fois sur des environnements POSIX et non-POSIX sans #ifdef
ou polymorphisme.
Bien que le verrouillage ne soit généralement pas coûteux sur les systèmes embarqués tels que les microcontrôleurs, il existe une grande variété de RTOS et aucune API standardisée pour le verrouillage. Le fait que plusieurs architectures soient présentes du 8051 au RISC-V signifie que les méthodes de gestion des interruptions ne sont pas non plus standardisées.
lockfree
fournit un moyen de créer du code embarqué portable avec un coût de performance négligeable par opposition au verrouillage, le code utilisant lockfree
peut être compilé pour s'exécuter sur n'importe quelle plate-forme embarquée prenant en charge C++11. De plus, le code peut facilement être testé sur une machine hôte sans avoir besoin de se moquer.
lockfree
? Toutes les structures de lockfree
sont délimitées , basées sur un tableau et sans verrouillage , les structures de données spsc sont également sans attente et sans danger pour la terminaison .
Pour plus d’informations sur la programmation sans verrouillage, consultez :