lockfree
es una colección de estructuras de datos sin bloqueo escritas en C++ 11 estándar y adecuadas para todas las plataformas, desde profundamente integradas hasta HPC.
Las estructuras de datos sin bloqueo son estructuras de datos que son seguras para subprocesos e interrupciones para uso simultáneo sin tener que utilizar mecanismos de exclusión mutua. Son más útiles para la comunicación entre procesos y, a menudo, escalan mucho mejor que las estructuras basadas en bloqueos con la cantidad de operaciones y subprocesos.
lockfree
Estas estructuras de datos tienen más rendimiento y generalmente deben usarse siempre que solo haya un hilo/interrupción enviando datos y otro recuperándolos.
Estas estructuras de datos son más generales y admiten múltiples productores y consumidores al mismo tiempo; sin embargo, tienen una sobrecarga de almacenamiento y rendimiento en comparación con las estructuras de datos de un solo productor y un solo consumidor. También requieren instrucciones atómicas que pueden faltar en algunos microcontroladores de gama baja.
Hay tres formas principales de obtener la biblioteca:
lockfree
utiliza la alineación de la línea de caché para los índices para evitar el fenómeno de intercambio falso de forma predeterminada, evitando la pérdida de rendimiento de la invalidación de la línea de caché en sistemas coherentes con la caché. Esto alinea los índices con LOCKFREE_CACHELINE_LENGTH
, 64
de forma predeterminada.
En sistemas integrados, LOCKFREE_CACHE_COHERENT
casi siempre debe establecerse como false
para evitar desperdiciar memoria.
Además, algunos sistemas tienen una longitud de línea de caché no típica (por ejemplo, las CPU Apple M1/M2 tienen una longitud de línea de caché de 128 bytes), y LOCKFREE_CACHELINE_LENGTH
debe configurarse en consecuencia en esos casos.
Todas las estructuras de datos en lockfree
solo deben usarse para tipos triviales.
La razón principal por la que desearía utilizar una estructura de datos sin bloqueos en entornos alojados sería evitar problemas relacionados con el bloqueo, como interbloqueos, inversión de prioridad y latencia de acceso no determinista. Cuando se usan correctamente, las estructuras de datos sin bloqueos también pueden mejorar el rendimiento en algunos escenarios.
Además, lockfree
proporciona una forma de crear aplicaciones y bibliotecas que se pueden compilar para funcionar en entornos POSIX y no POSIX sin #ifdef
so polimorfismo.
Si bien el bloqueo generalmente no es costoso en sistemas integrados como los microcontroladores, existe una amplia variedad de RTOS y no hay una API estandarizada para el bloqueo. El hecho de que haya múltiples arquitecturas desde 8051 hasta RISC-V significa que los métodos de gestión de interrupciones tampoco están estandarizados.
lockfree
proporciona una forma de crear código integrado portátil con un costo de rendimiento insignificante en comparación con el bloqueo; el código que utiliza lockfree
se puede compilar para ejecutarse en cualquier plataforma integrada que admita C++ 11. Además, el código se puede probar fácilmente en una máquina host sin necesidad de burlarse.
lockfree
? Todas las estructuras en lockfree
están limitadas , basadas en matrices y sin bloqueos , las estructuras de datos spsc también están libres de espera y son seguras para la terminación .
Para obtener más información sobre la programación sin bloqueos, consulte: