在 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”(比较并设置)。
swp
和 swpb
可以用来做一些原始的四值操作,但它们不是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/