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() と一緒に と友達 (上にリンクされています) には、すべての主要なデスクトップ プラットフォーム用の何かが必要です。
私はまだ自分でそれらを使用していませんが、今後数日で使用する可能性があることに注意してください.