lockfree
是用标准 C++11 编写的无锁数据结构的集合,适用于从深度嵌入式到 HPC 的所有平台。
无锁数据结构是线程和中断安全的数据结构,可以并发使用,而无需使用互斥机制。它们对于进程间通信最有用,并且在操作和线程数量方面通常比基于锁的结构更好地扩展。
lockfree
这些数据结构的性能更高,通常应在只有一个线程/中断推送数据而另一个线程/中断检索数据时使用。
这些数据结构更通用,同时支持多个生产者和消费者,但是与单生产者单消费者数据结构相比,它们具有存储和性能开销。它们还需要一些低端微控制器可能缺少的原子指令。
获取该库的方式主要有以下三种:
lockfree
默认对索引使用cacheline对齐来避免FalseSharing现象,避免了cachecoherent系统上cacheline失效带来的性能损失。这会将索引与LOCKFREE_CACHELINE_LENGTH
对齐,默认情况下为64
。
在嵌入式系统上, LOCKFREE_CACHE_COHERENT
几乎应始终设置为false
以避免浪费内存。
此外,某些系统具有非典型的缓存行长度(例如苹果 M1/M2 CPU 的缓存行长度为 128 字节),在这些情况下应相应地设置LOCKFREE_CACHELINE_LENGTH
。
lockfree
中的所有数据结构仅适用于普通类型。
您希望在托管环境中使用无锁数据结构的最大原因是避免与锁定有关的问题,例如死锁、优先级反转和不确定性访问延迟。如果使用得当,无锁数据结构在某些场景下还可以提高性能。
此外, lockfree
提供了一种构建应用程序和库的方法,这些应用程序和库可以编译为在 POSIX 和非 POSIX 环境中工作,而无需#ifdef
或多态性。
虽然锁定在微控制器等嵌入式系统上通常并不昂贵,但 RTOS 种类繁多,并且没有用于锁定的标准化 API。事实上,从 8051 到 RISC-V 存在多种架构,这意味着中断管理方法也没有标准化。
lockfree
提供了一种构建可移植嵌入式代码的方法,与锁定相比,性能成本可以忽略不计,使用lockfree
代码可以编译为在任何支持 C++11 的嵌入式平台上运行。此外,代码可以轻松地在主机上进行测试,而无需进行模拟。
lockfree
中数据结构的正式分类是什么? lockfree
中的所有结构都是有界的、基于数组且无锁的,spsc 数据结构也是waitfree和终止安全的。
要更深入地了解无锁编程,请查看: