UNIX便携式原子操作

dme*_*ter 30 c concurrency posix atomic

在C中是否有(POSIX-)可移植方式用于原子变量操作,类似于使用pthread的可移植线程?

原子操作是像"递增和获取"这样的操作,它们以原子方式执行,这意味着没有上下文切换可以干扰操作.在Linux内核空间中,我们必须使用atomic_t类型,在Java中我们有java.util.concurrent.atomic包.

在Linux上,atomic.h文件提供原子操作,但include依赖于平台,例如#include <asm-x86_64/atomic.h>,它在Mac OS X上不能以类似的方式提供.

小智 13

对于任何在未来偶然发现这种情况的人来说,C11原子是现在最好的方法 - 我相信它们将被纳入GCC 4.9.

  • 你能扩展一下吗? (15认同)

ece*_*ulm 13

从C11开始,有一个可选的Atomic库,它提供原子操作.对于具有此可选功能的C11编译器(如gcc-4.9)的任何平台,这都是可移植的.

可以检查原子__STDC_NO_ATOMICS__的存在和存在<stdatomic.h>

atomic.c

#include <stdio.h>
#include <stdlib.h>
#ifndef __STDC_NO_ATOMICS__
#include <stdatomic.h>
#endif

int main(int argc, char**argv) {
    _Atomic int a;
    atomic_init(&a, 42);
    atomic_store(&a, 5);
    int b = atomic_load(&a);
    printf("b = %i\n", b);

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

编译器调用

clang -std=c11 atomic.c
gcc -std=c11 atomic.c
Run Code Online (Sandbox Code Playgroud)


小智 10

既然你要求OS X:

(并且因为在这个帖子中引发了跨平台性.)

OS X具有OSAtomicAdd32()和朋友的功能.它们在"/usr/include/libkern/OSAtomic.h"中声明.请参阅"线程编程"指南的 "使用原子操作"部分.

对于Windows,有InterlockedIncrement()和朋友(参见MSDN).

与gcc builtins __sync_fetch_and_add()和朋友(已在上面链接)一起,您应该为每个主要桌面平台提供一些东西.

请注意,我自己还没有使用它们,但可能会在接下来的几天内使用它们.


pax*_*blo 5

不,POSIX 不指定任何可移植的无锁/原子操作。这就是为什么他们有pthreads。

您要么必须使用非标准方法,要么坚持使用 ptrheads 以实现可移植性。