根据C++是int的读写吗?的说法,由于处理器缓存的问题,ints的读取(以及这些指针--或者我假设的那样)在C中并不是原子的,所以,我的问题是,我可以使用某些程序集来使读原子化,还是需要使用锁?我查看了几组原子操作库,到目前为止,我还无法找到一个用于原子读取的函数。
编辑:编译器:Clang2.9编辑: Platform: x86 (64位)
谢谢。
发布于 2011-07-13 00:43:50
通常,原子操作库不提供简单的原子获取,因为它很少被使用;您读取值,然后使用它做一些事情,在此过程中需要保持锁,以便您知道所读取的值没有更改。因此,不需要原子读取,而是有某种类型的原子测试和集合(例如gcc的__sync_fetch_and_add())来执行锁,然后在持有锁时执行正常的非同步读取。
例外是设备驱动程序,您可能需要实际锁定系统总线才能获得总线上其他设备的原子性,或者在实现原子操作库的锁定原语时;这些都是机器特有的,您必须深入了解汇编语言。在x86处理器上,有各种原子指令,加上一个lock前缀,可以应用于大多数访问内存和在操作期间保持总线锁的操作;其他平台(SPARC、MIPS等)。有相似的机制,但细节往往不同。在这种情况下,您必须了解您正在为之编程的CPU,并且很可能必须了解有关机器总线架构的一些知识。这方面的库很少有意义,因为您不能在函数输入/退出之间持有总线或内存锁,即使使用宏库,也必须小心,因为这意味着可以在宏调用之间穿插正常操作,而实际上,这可能会破坏锁。用汇编语言编写整个关键部分几乎总是更好。
发布于 2011-07-13 00:34:13
gcc有一组原子内建函数,但它没有普通的原子获取,但是您可以做一些类似__sync_fetch_and_add(&<your variable here>, 0);的操作来解决这个问题。
GCC的文档是这里,上面的博客文章
编辑:啊,clang,我知道LLVM IR里面有原子,但是我不知道clang是否以任何方式暴露了它们,但是它可能值得一试,看看它是否抱怨使用gcc的,它可能支持它们。编辑:嗯,好像有什么.然而,clang文档并没有gcc做的那么多,而医生们似乎也认为它也可能做gcc的工作。
https://stackoverflow.com/questions/6672805
复制相似问题