1. ホーム
  2. c

[解決済み] sig_atomic_tは実際にどのように動作するのですか?

2022-02-28 14:21:55

質問

コンパイラやOSは、sig_atomic_t型と通常のint型変数をどのように区別し、アトミックな演算を保証しているのでしょうか?両方を使っているプログラムは同じアセンブラコードになります。アトミックに動作させるために、どのような工夫をしているのでしょうか?

どのように解決するのですか?

sig_atomic_t はアトミックなデータ型ではありません。シグナルハンドラのコンテキストで使うことが許されているデータ型、ただそれだけです。ですから、この名前は「シグナル処理に関連したアトミックなもの」と読んだ方がいいでしょう。

シグナルハンドラとの通信を保証するために必要なのは、アトミックデータ型の特性の1つ、すなわち、読み取りと更新が常に一貫した値を見るという事実だけです。他のデータ型(例えば、おそらく long long ) は、下位部分と上位部分に対していくつかのアセンブラ命令で記述することができます、例えば sig_atomic_t は、一度の読み書きが保証されています。

したがって、プラットフォームは、任意の整数の基本型を sig_atomic_t を保証することができます。 volatile sig_atomic_t は、シグナルハンドラで安全に使用することができます。多くのプラットフォームは int というのも、自分たちにとって int は1つの命令で書かれています。

最新のC規格であるC11にはアトミック型がありますが、これは全くの別物です。その一部("lockfree"であるもの)はシグナルハンドラで使われることもありますが、これもまた全く別の話です。