根据C++ 对 int 的读写是原子的吗? https://stackoverflow.com/questions/54188/are-c-reads-and-writes-of-an-int-atomic,由于处理器缓存的问题,整数的读取(因此指针——或者我假设)在 C 中不是原子的。所以,我的问题是是否有一些程序集可以用来使读取成为原子的,或者我应该这样做吗?需要使用锁吗?我查看了几组原子操作库,到目前为止,我无法找到用于原子读取的函数。
编辑:编译器:铿锵2.9编辑:平台:x86(64 位)
Thanks.
一般来说,原子操作库不提供简单的原子获取,因为它很少使用;您读取该值,然后对其执行某些操作,并且在此期间需要保持锁定,以便您知道您读取的值没有更改。因此,不是原子读取,而是某种原子测试和设置(例如gcc
's __sync_fetch_and_add()
)执行锁定,然后您在持有锁定时执行正常的非同步读取。
设备驱动程序是个例外,您可能必须实际锁定系统总线才能获得相对于总线上其他设备的原子性,或者在实现原子操作库的锁定原语时;这些本质上是特定于机器的,您必须深入研究汇编语言。在 x86 处理器上,有各种原子指令,以及lock
可应用于大多数访问内存并在操作期间保持总线锁定的操作的前缀;其他平台(SPARC、MIPS 等)也有类似的机制,但细节通常有所不同。在这种情况下,您必须了解正在编程的 CPU,并且很可能必须了解有关机器的总线体系结构的信息。而用于此目的的库很少有意义,因为您无法在函数入口/出口之间保持总线或内存锁,即使使用宏库,也必须小心,因为这意味着在宏调用之间可能会散布正常操作事实上这可能会破坏锁定。用汇编语言编写整个关键部分几乎总是更好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)