#ifdef __STDC_NO_ATOMICS__
# error this implementation needs atomics
#endif
#include <stdatomic.h>
C言語の一部としてのAtomicsは、C11以降で使用可能なオプションの機能です。
それらの目的は、異なるスレッド間で共有される変数への競合のないアクセスを保証することです。原子修飾がなければ、2つのスレッドが同時にアクセスすると、共有変数の状態は未定義になります。例えば、インクリメント演算( ++
)は、いくつかのアセンブラ命令、読み出し、加算自体、およびストア命令に分割することができる。別のスレッドが同じ操作を行っている場合、その2つの命令シーケンスが絡み合い、矛盾した結果につながる可能性があります。
型:配列型を除くすべてのオブジェクト型は_Atomic
で修飾できます。
演算子:これらの演算子( ++
や*=
)は、すべて原子であることが保証されています。
操作:型ジェネリック関数として指定される他の操作がいくつかあります(例: atomic_compare_exchange
。
スレッド:異なるスレッドからアクセスされた場合、それらにアクセスすることでデータ競合が発生しないことが保証されます。
シグナルハンドラ:原子タイプは、それらのすべての操作がステートレスであればロックフリーと呼ばれます 。この場合、通常の制御フローとシグナルハンドラの間で状態変化を処理するために使用することもできます。
ロックフリーであることが保証されているデータ型はatomic_flag
です。これは、効率的なテストと設定のハードウェアの指示に対応する操作を行う最小限のタイプです。
競合状態を回避するための他の手段はC11のスレッドインタフェースで利用できます。特にスレッドが重要なデータやコードのクリティカルセクションにアクセスすることを相互に排除するmutex型のmtx_t
があります。アトミックが利用できない場合は、これらを使用してレースを防止する必要があります。