根据c++读写int原子吗?在c中,由于处理器缓存的问题,对int的读取(以及指针——或者我认为)不是原子的。所以,我的问题是,是否有一些程序集可以用来使读取原子化,或者我需要使用锁?我查看了几组原子操作库,但是,到目前为止,我还没有找到一个用于原子读取的函数。
EDIT: Compiler: Clang 2.9EDIT: Platform: x86(64位)
谢谢。
一般来说,原子操作库不提供简单的原子读取,因为它很少使用;你读取这个值,然后对它做一些事情,在这个过程中锁需要被持有,这样你就知道你读取的值没有改变。因此,不是原子读,而是某种原子测试集(例如gcc
的__sync_fetch_and_add()
)执行锁,然后在持有锁的同时执行正常的非同步读。
例外是设备驱动程序,你可能需要实际锁定系统总线来获得相对于总线上其他设备的原子性,或者在实现原子操作库的锁定原语时;这些本质上是特定于机器的,您必须深入研究汇编语言。在x86处理器上,有各种原子指令,加上一个lock
前缀,可以应用于大多数访问内存的操作,并在操作期间保持总线锁;其他平台(SPARC、MIPS等)也有类似的机制,但细节往往有所不同。在这种情况下,您必须了解正在为之编程的CPU,并且很可能还必须了解机器的总线体系结构。这方面的库很少有意义,因为您不能在函数入口/出口之间持有总线或内存锁,即使使用宏库,也必须小心,因为这意味着可以在宏调用之间穿插正常操作,而实际上这可能会破坏锁定。用汇编语言编写整个临界区几乎总是更好的。
gcc有一组原子内置函数,但它没有一个普通的原子获取,但是你可以做一些像__sync_fetch_and_add(&<your variable here>, 0);
的事情来解决这个
GCC文档在这里,上面有博客文章
编辑:啊,clang,我知道LLVM IR中有原子,但我不知道clang是否以任何方式暴露它们,但它可能值得一试,看看它是否抱怨使用gcc的原子,它可能支持它们。编辑:嗯,它似乎有什么……虽然Clang文档没有GCC做那么多,但文档似乎建议它也可以做GCC的文档。