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