UNIX ポータブル アトミック オペレーション

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;
}

コンパイラの呼び出し

clang -std=c11 atomic.c
gcc -std=c11 atomic.c

将来これに出くわす人にとっては、C11 アトミックが今これを行うための最良の方法です。GCC 4.9 に含まれると思います。


あなたが OS X を求めたので:

(そして、このスレッドでクロス プラットフォームが提起されたため。)

OS X には関数 OSAtomicAdd32() があります と友達。それらは「/usr/include/libkern/OSAtomic.h」で宣言されています。スレッドプログラミングガイドのセクション「アトミック操作の使用」を参照してください。

Windows の場合は、InterlockedIncrement() があります。 および友人 (MSDN を参照)。

gcc ビルトイン __sync_fetch_and_add() と一緒に と友達 (上にリンクされています) には、すべての主要なデスクトップ プラットフォーム用の何かが必要です。

私はまだ自分でそれらを使用していませんが、今後数日で使用する可能性があることに注意してください.