在C中有任何实现吗?到目前为止,我所看到的所有内容都是基于LDREX / STREX指令的,该指令仅在ARMv6架构中引入。对于以前的体系结构,唯一可能的解决方案似乎是禁用/启用IRQ,这会阻塞操作。
最佳答案
在C中有任何实现吗?
不可以。没有编译器或程序集的支持(编译器中的程序集支持),就不可能实现为“C”。 'C'没有指令来保证某些东西是原子执行的。
对于以前的体系结构,唯一可能的解决方案似乎是禁用/启用IRQ,这会阻塞操作。
许多无锁算法都需要“CAS”(比较并设置)。 swp
和swpb
可用于执行一些原始的四值运算,但它们不是CAS。为了执行四个源和一个使用者,您可以使用swpb
将四个字节中的每个字节给源,并让使用者使用swp
传输四个“工作”字节。 ARMv6之前的大多数ARM cpus是单核,并且锁定中断是执行操作的常用方法。 ARMv6内核支持LDREX / STREX。 swp
指令不是多CPU友好的,因为它锁定了整个总线以进行事务处理(读/写)。但是,如果只有swp
可以将其用于自旋锁。
Linux支持与OS help进行“比较和交换”。要点是一个小的固定汇编程序序列进行比较和交换。钩住了中断和数据中止代码,以确保该代码是否被中断而重新启动。