加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

原子读在C

发布时间:2020-12-16 05:29:20 所属栏目:百科 来源:网络整理
导读:根据 Are C++ Reads and Writes of an int Atomic?,由于处理器缓存的问题,读取int(因此我假设的指针)在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,并且可能需要了解有关机器总线架构的内容.而对于这种情况而言,库很少有意义,因为您不能在功能进入/退出之间持有总线或内存锁,即使使用宏库,也必须谨慎,因为这可能会在宏调用之间插入正常的操作事实上可能会阻止锁定.用汇编语言编写整个关键部分几乎总是更好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读