原子读在C

根据 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,并且可能需要了解有关机器总线架构的内容.而对于这种情况而言,库很少有意义,因为您不能在功能进入/退出之间持有总线或内存锁,即使使用宏库,也必须谨慎,因为这可能会在宏调用之间插入正常的操作事实上可能会阻止锁定.用汇编语言编写整个关键部分几乎总是更好.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...