最近、私は原子の読み書きのLinuxカーネル実装を検討し、いくつかの質問が出ました。 IA64アーキテクチャからLinuxカーネルでの原子操作の読み込みと書き込み
第1の関連コード:読み取りと書き込みの両方の動作について
typedef struct {
int counter;
} atomic_t;
#define atomic_read(v) (*(volatile int *)&(v)->counter)
#define atomic64_read(v) (*(volatile long *)&(v)->counter)
#define atomic_set(v,i) (((v)->counter) = (i))
#define atomic64_set(v,i) (((v)->counter) = (i))
は、直接的なアプローチは、読み取りまたは変数への書き込みをしたと思われます。どこか別の仕掛けがない限り、私は、この操作がアセンブリドメイン内で原子的であることが保証されていることを理解していません。私は明らかな答えは、そのような操作は、1つのアセンブリopcodeに変換されますが、そのように、どのように考慮する別のメモリキャッシュレベル(または他の最適化)を考慮する保証はありますか?
読み取りマクロでは、キャストトリックで揮発性タイプが使用されます。誰もが、これがここでどのように原子性に影響するかを手がかりにしていますか?あなたが特定のアーキテクチャのために書く場合、あなたはそれに仮定を特定することができます
現代のカーネルでは、ここでは 'volatile'は' READ_ONCE() '/' WRITE_ONCE'と呼ばれるマクロを通して使用されます。私の頭の中の解釈は、コンパイラが技術的に値*複数*回の読み書きが許可されていることです。例えば。コードが読み取り値をローカル変数にコピーし、それを別の場所で使用する場合したがって、値をローカルにキャッシュされないようにするだけでは不十分です。完全な説明:https://lwn.net/Articles/508991/ – sourcejedi