Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的原子读取_C_Multithreading_Concurrency_Atomic_Clang - Fatal编程技术网

C语言中的原子读取

C语言中的原子读取,c,multithreading,concurrency,atomic,clang,C,Multithreading,Concurrency,Atomic,Clang,根据,由于处理器缓存的问题,在C语言中,int(和指针——或者我认为是这样)的读取不是原子的。所以,我的问题是,是否有一些程序集可以用来使读取原子化,或者我需要使用锁?我查看了几组原子操作库,到目前为止,我还无法找到用于原子读取的函数 编辑:编译器:Clang 2.9 编辑:平台:x86(64位) 谢谢。gcc有一组原子内置函数,但它没有简单的原子获取,但是您可以执行类似于\uu sync\u fetch\u和\u add(&,0)的操作来解决这个问题 GCC文档是,上面有一篇博文 编辑:啊,c

根据,由于处理器缓存的问题,在C语言中,int(和指针——或者我认为是这样)的读取不是原子的。所以,我的问题是,是否有一些程序集可以用来使读取原子化,或者我需要使用锁?我查看了几组原子操作库,到目前为止,我还无法找到用于原子读取的函数

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


谢谢。

gcc有一组原子内置函数,但它没有简单的原子获取,但是您可以执行类似于
\uu sync\u fetch\u和\u add(&,0)的操作来解决这个问题

GCC文档是,上面有一篇博文


编辑:啊,clang,我知道LLVM IR中有原子,但我不知道clang是否以任何方式暴露了它们,但可能值得一试,看看它是否抱怨使用gcc的原子,它可能会支持它们。编辑:嗯,好像有什么。。。但是它没有gcc做的那么多,文档似乎建议它也可以做gcc的。

一般来说,原子操作库不提供简单的原子获取,因为它很少使用;您读取值,然后对其执行操作,在执行操作期间需要保持锁定,以便您知道您读取的值没有更改。因此,除了原子读取之外,还有一个原子测试和某种类型的集合(例如,
gcc
\u sync\u fetch\u和\u add()


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

如果是GCC,您可以使用它。我不是在回答这个问题,因为我基本上是在重复别人的博客文章。我根据你上次编辑的内容更新了你的标签。注意术语。在32+位平台上,在正确对齐的内存上读取和写入32位结构是原子的;也就是说,该值不能在读取或写入过程的中途更改。(大多数编译器都会正确地对齐内存以实现这一点。)Clang不能确保您获得的值与“最新”值一致,也不能确保读写操作按照代码中显示的确切顺序进行。还有什么平台?ARM?真的有可能造成一种实际显示问题的情况吗?这看起来像什么?值得注意的是,编译器在使用这些时会自动进行类型转换+1.但是,唉。。Clang:)“Clang支持许多与GCC语法相同的内置库函数,包括…,
\uuuu sync\u fetch\u和uu add
,等等。”问题是,在某些系统上,除非在读写操作上做一些特殊的操作,否则无法获得正确的结果,也就是说,如果你在做一个简短的计算,那么你就要做一个CAS,这样只有在你工作时数值没有变化的情况下才会发生变化。@Spudd86:我会把它们归为第二组,而不是第一组。@geeksaur我很确定这就是问题所在though@Spudd86:这就是为什么我包括了对它们的讨论,这比另一个要长。@spud86:稍微少一点窃笑:有两个问题,关于低级/asm的东西,关于为什么库没有原子读取,所以我解决了这两个问题。