首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原子读入C

原子读入C
EN

Stack Overflow用户
提问于 2011-07-13 00:26:37
回答 2查看 5.1K关注 0票数 9

根据C++是int的读写吗?的说法,由于处理器缓存的问题,ints的读取(以及这些指针--或者我假设的那样)在C中并不是原子的,所以,我的问题是,我可以使用某些程序集来使读原子化,还是需要使用锁?我查看了几组原子操作库,到目前为止,我还无法找到一个用于原子读取的函数。

编辑:编译器:Clang2.9编辑: Platform: x86 (64位)

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-13 00:43:50

通常,原子操作库不提供简单的原子获取,因为它很少被使用;您读取值,然后使用它做一些事情,在此过程中需要保持锁,以便您知道所读取的值没有更改。因此,不需要原子读取,而是有某种类型的原子测试和集合(例如gcc__sync_fetch_and_add())来执行锁,然后在持有锁时执行正常的非同步读取。

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

票数 6
EN

Stack Overflow用户

发布于 2011-07-13 00:34:13

gcc有一组原子内建函数,但它没有普通的原子获取,但是您可以做一些类似__sync_fetch_and_add(&<your variable here>, 0);的操作来解决这个问题。

GCC的文档是这里,上面的博客文章

编辑:啊,clang,我知道LLVM IR里面有原子,但是我不知道clang是否以任何方式暴露了它们,但是它可能值得一试,看看它是否抱怨使用gcc的,它可能支持它们。编辑:嗯,好像有什么.然而,clang文档并没有gcc做的那么多,而医生们似乎也认为它也可能做gcc的工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6672805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档