c - ARMv6 之前的 ARM 架构上的无锁原子操作

标签 c arm atomic lock-free

在 C 中是否有任何实现?到目前为止,我所看到的所有指令都基于 LDREX/STREX 指令,这些指令仅在 ARMv6 架构中引入。以前架构的唯一可能解决方案似乎是禁用/启用 IRQ,这会导致操作阻塞。

最佳答案

Are there any implementations thereof in C?



不。如果没有编译器或程序集的支持(编译器中的程序集支持),就不可能实现这是“C”。 'C' 没有指令来保证某事以原子方式执行。

The only possible solution for previous architectures seems to be to disable/enable IRQs, which makes the operations blocking.



许多无锁算法需要“CAS”(比较并设置)。 swpswpb可以用来做一些原始的四值操作,但它们不是CAS。为了做四个源和一个消费者,您可以使用 swpb 为源分配四个字节中的每一个。并让消费者使用 swp传输四个“工作”字节。 ARMv6 之前的大多数 ARM cpu 都是单核的,锁定中断是常见的处理方式。 ARMv6 内核支持 LDREX/STREX。 swp指令不是多 CPU 友好的,因为它锁定了事务(读/写)的整个总线。然而,swp如果它是唯一可用的东西,则可用于自旋锁。

Linux 支持与 OS help 的“比较和交换” .要点是一个小的固定汇编程序序列进行比较和交换。中断和数据中止代码被 Hook 以确保此代码是否被中断并重新启动。

关于c - ARMv6 之前的 ARM 架构上的无锁原子操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44883426/

相关文章:

android - ARM Assembler NEON - 提高性能

c++ - Facebook folly::AccessSpreader 是如何工作的?

c - 用 `memory_order_seq_cst` 排序原子

c++ - 获取/释放与顺序一致的内存顺序

c - SPIM(MIPS 模拟器)无法解析以下语句 lui $2,%hi($LC0)

arrays - 如何通过数组指针访问数组的各个元素?

linux - 访问外部设备时 ARM Cortex 上的 SIGBUS

c cgi如何获取表单

c - 如何在 C 中打开文件以读取和写入其他文件?

c - 内核如何知道当前线程是什么?