lockfree
é uma coleção de estruturas de dados sem bloqueio escritas no padrão C++ 11 e adequadas para todas as plataformas - desde profundamente incorporadas até HPC.
Estruturas de dados sem bloqueio são estruturas de dados seguras para threads e interrupções para uso simultâneo, sem a necessidade de usar mecanismos de exclusão mútua. Eles são mais úteis para comunicação entre processos e muitas vezes escalam muito melhor do que estruturas baseadas em bloqueio com o número de operações e threads.
lockfree
Essas estruturas de dados têm melhor desempenho e geralmente devem ser usadas sempre que houver apenas um thread/interrupção enviando dados e outro recuperando-os.
Essas estruturas de dados são mais gerais, suportando vários produtores e consumidores ao mesmo tempo, porém apresentam sobrecarga de armazenamento e desempenho em comparação com estruturas de dados de produtor único e consumidor único. Eles também exigem instruções atômicas que podem estar faltando em alguns microcontroladores de baixo custo.
Existem três maneiras principais de obter a biblioteca:
lockfree
usa alinhamento de cacheline para índices para evitar o fenômeno de compartilhamento falso por padrão, evitando a perda de desempenho da invalidação de cacheline em sistemas coerentes de cache. Isso alinha os índices a LOCKFREE_CACHELINE_LENGTH
, 64
por padrão.
Em sistemas embarcados, LOCKFREE_CACHE_COHERENT
quase sempre deve ser definido como false
para evitar desperdício de memória.
Além disso, alguns sistemas têm um comprimento de cache não típico (por exemplo, as CPUs Apple M1/M2 têm um comprimento de cache de 128 bytes) e LOCKFREE_CACHELINE_LENGTH
deve ser definido adequadamente nesses casos.
Todas as estruturas de dados em lockfree
devem ser usadas apenas para tipos triviais.
O maior motivo pelo qual você desejaria usar uma estrutura de dados sem bloqueio em ambientes hospedados seria evitar problemas relacionados ao bloqueio, como impasses, inversão de prioridade e latência de acesso não determinística. Quando usadas corretamente, as estruturas de dados sem bloqueio também podem melhorar o desempenho em alguns cenários.
Além disso, lockfree
fornece uma maneira de construir aplicativos e bibliotecas que podem ser compiladas para funcionar em ambientes POSIX e não POSIX sem #ifdef
s ou polimorfismo.
Embora o bloqueio geralmente não seja caro em sistemas embarcados, como microcontroladores, há uma grande variedade de RTOS-es e nenhuma API padronizada para bloqueio. O fato de múltiplas arquiteturas estarem presentes desde 8051 até RISC-V significa que os métodos de gerenciamento de interrupções também não são padronizados.
lockfree
fornece uma maneira de construir código embarcado portátil com um custo de desempenho insignificante, em oposição ao bloqueio. O código usando lockfree
pode ser compilado para ser executado em qualquer plataforma embarcada que suporte C++ 11. Além disso, o código pode ser facilmente testado em uma máquina host sem a necessidade de simulação.
lockfree
? Todas as estruturas em lockfree
são limitadas , baseadas em array e livres de bloqueio , as estruturas de dados spsc também são livres de espera e seguras para terminação .
Para obter mais informações sobre programação sem bloqueio, dê uma olhada em: