sig_atomic_t
アトミック データ型ではありません。シグナルハンドラのコンテキストで使用できるのはデータ型だけです。それだけです。そのため、名前を「シグナル処理に関連するアトミック」と読んだほうがよいでしょう。
シグナル ハンドラーとの通信を保証するために必要なのは、アトミック データ型のプロパティの 1 つだけです。つまり、読み取りと更新は常に一貫した値を参照するという事実です。その他のデータ型 (おそらく long long
など) ) は、下位部分と上位部分のいくつかのアセンブラー命令で記述できます。 sig_atomic_t
一度に読み書きできることが保証されています。
したがって、プラットフォームは sig_atomic_t
として任意の整数ベース タイプを選択できます。 volatile sig_atomic_t
であることを保証できます。 シグナルハンドラで安全に使用できます。多くのプラットフォームが int
を選択しました int
を知っているからです。 単一の命令で書かれています。
最新の C 標準である C11 にはアトミック型がありますが、これはまったく別のものです。それらの一部 (「ロックフリー」のもの) はシグナル ハンドラーでも使用できますが、これもまたまったく別の話です。
sig_atomic_t
に注意してください スレッド セーフではなく、非同期シグナル セーフのみです。
アトミックには 2 種類のバリアが含まれます:
<オール>volatile
です このテーマの包括的な取り扱いについては、atomic Weapons:The C++ Memory Model and Modern Hardware をご覧ください。