根据
Are C++ Reads and Writes of an int Atomic?,由于处理器缓存的问题,读取int(因此我假设的指针)在C中并不是原子.所以我的问题是有一些程序集可以用来使读取原子,还是需要使用锁?我看了几套原子操作库,而且至今,我无法找到一个原子阅读的功能.
编辑:编译器:Clang 2.9
编辑:平台:x86(64位)
谢谢.
解决方法
通常,原子操作库不提供简单的原子获取,因为它很少使用;你读了这个值,然后用它做一些事情,而锁需要在那个东西中保持,以便你知道你读的值没有改变.所以代替原子读取,有一种原子测试和某种类型的测试(例如,gcc的__sync_fetch_and_add()),它执行锁定,然后在持有锁时执行正常的不同步读取.
例外是设备驱动程序,您可能必须实际锁定系统总线以获得关于总线上其他设备的原子性,或实现原子操作库的锁定原语时;这些是固有的机器特定的,你必须深入汇编语言.在x86处理器上,有各种原子指令,加上一个锁前缀,可以应用于在操作期间访问内存并持有总线锁的大多数操作;其他平台(SPARC,MIPS等)也有类似的机制,但细节的细节往往不同.在这种情况下,您将不得不知道您正在编程的cpu,并且可能需要了解有关机器总线架构的内容.而对于这种情况而言,库很少有意义,因为您不能在功能进入/退出之间持有总线或内存锁,即使使用宏库,也必须谨慎,因为这可能会在宏调用之间插入正常的操作事实上可能会阻止锁定.用汇编语言编写整个关键部分几乎总是更好.