lockfree
— это набор структур данных без блокировки, написанных на стандарте C++11 и подходящих для всех платформ — от глубоко встроенных до HPC.
Структуры данных без блокировки — это структуры данных, которые безопасны для потоков и прерываний для одновременного использования без необходимости использования механизмов взаимного исключения. Они наиболее полезны для межпроцессного взаимодействия и часто масштабируются намного лучше, чем структуры на основе блокировок, с учетом количества операций и потоков.
lockfree
Эти структуры данных более производительны и, как правило, их следует использовать всякий раз, когда есть только один поток/прерывание, отправляющий данные, а другой их извлекающий.
Эти структуры данных являются более общими и поддерживают одновременно несколько производителей и потребителей, однако у них есть накладные расходы на хранение и производительность по сравнению со структурами данных одного производителя и одного потребителя. Им также требуются атомарные инструкции, которые могут отсутствовать в некоторых микроконтроллерах начального уровня.
Получить библиотеку можно тремя основными способами:
lockfree
использует выравнивание строки кэша для индексов, чтобы избежать явления ложного совместного использования по умолчанию, избегая потери производительности из-за аннулирования строки кэша в системах с когерентным кэшем. Это выравнивает индексы по LOCKFREE_CACHELINE_LENGTH
, по умолчанию 64
.
Во встроенных системах LOCKFREE_CACHE_COHERENT
почти всегда должен быть установлен как false
, чтобы избежать потери памяти.
Кроме того, некоторые системы имеют нетипичную длину кэша (например, процессоры Apple M1/M2 имеют длину кэша 128 байт), и в этих случаях необходимо установить LOCKFREE_CACHELINE_LENGTH
соответствующим образом.
Все структуры данных в lockfree
предназначены для использования только с тривиальными типами.
Основная причина, по которой вы захотите использовать структуру данных без блокировки в размещенных средах, — это избежание проблем, связанных с блокировкой, таких как взаимоблокировки, инверсия приоритетов и недетерминированная задержка доступа. При правильном использовании структуры данных без блокировки также могут повысить производительность в некоторых сценариях.
Кроме того, lockfree
предоставляет возможность создавать приложения и библиотеки, которые можно скомпилировать для работы как в средах POSIX, так и в средах, не поддерживающих POSIX, без #ifdef
или полиморфизма.
Хотя блокировка обычно не требует больших затрат во встроенных системах, таких как микроконтроллеры, существует большое разнообразие ОСРВ и нет стандартизированного API для блокировки. Тот факт, что присутствует несколько архитектур от 8051 до RISC-V, означает, что методы управления прерываниями также не стандартизированы.
lockfree
предоставляет способ создания переносимого встроенного кода с незначительными затратами производительности в отличие от блокировки. Код, использующий lockfree
можно скомпилировать для запуска на любой встроенной платформе, поддерживающей C++11. Кроме того, код можно легко протестировать на хост-компьютере без необходимости создания макетов.
lockfree
? Все структуры в lockfree
являются ограниченными , основанными на массивах и без блокировок , структуры данных spsc также не требуют ожидания и безопасны для завершения .
Для получения более подробной информации о программировании без блокировки взгляните на: