微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/c/114657.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐