gpt4 book ai didi

c - C 中的原子读取

转载 作者:太空狗 更新时间:2023-10-29 16:48:41 26 4
gpt4 key购买 nike

根据 Are C++ Reads and Writes of an int Atomic? ,由于处理器缓存的问题,int 的读取(因此指针——或者我假设)在 C 中不是原子的。所以,我的问题是是否有一些程序集可以用来使读取成为原子的,或者我需要用锁吗?我查看了几组原子操作库,但到目前为止,我无法找到用于原子读取的函数。

编辑:编译器: Clang 2.9编辑:平台: x86(64 位)

谢谢。

最佳答案

一般来说,原子操作库不提供简单的原子提取,因为它很少被使用;您读取该值然后对其进行处理,并且需要在此期间保持锁定,以便您知道您读取的值没有改变。因此,不是原子读取,而是某种原子测试和设置(例如 gcc__sync_fetch_and_add())执行锁定,然后您执行持有锁时正常的非同步读取。

异常(exception)是设备驱动程序,您可能必须实际锁定系统总线以获得相对于总线上其他设备的原子性,或者在为原子操作库实现锁定原语时;这些本质上是特定于机器的,您必须深入研究汇编语言。在 x86 处理器上,有各种原子指令,加上一个 lock 前缀,可以应用于大多数访问内存并在操作期间持有总线锁的操作;其他平台(SPARC、MIPS 等)也有类似的机制,但细节往往不同。在这种情况下,您将必须了解您正在为其编程的 CPU,并且很可能必须了解机器的总线架构。并且用于此的库很少有意义,因为您不能在函数进入/退出时持有总线或内存锁,即使使用宏库也必须小心,因为这意味着在进入时可能会在宏调用之间穿插正常操作可能会破坏锁定的事实。用汇编语言编写整个关键部分几乎总是更好。

关于c - C 中的原子读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6672805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com