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

最佳答案

在C中有任何实现吗?

不可以。没有编译器或程序集的支持(编译器中的程序集支持),就不可能实现为“C”。 'C'没有指令来保证某些东西是原子执行的。

对于以前的体系结构,唯一可能的解决方案似乎是禁用/启用IRQ,这会阻塞操作。

许多无锁算法都需要“CAS”(比较并设置)。 swpswpb可用于执行一些原始的四值运算,但它们不是CAS。为了执行四个源和一个使用者,您可以使用swpb将四个字节中的每个字节给源,并让使用者使用swp传输四个“工作”字节。 ARMv6之前的大多数ARM cpus是单核,并且锁定中断是执行操作的常用方法。 ARMv6内核支持LDREX / STREX。 swp指令不是多CPU友好的,因为它锁定了整个总线以进行事务处理(读/写)。但是,如果只有swp可以将其用于自旋锁。

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

10-05 23:48