低レベルのアトミック操作。これらは基本的にハードウェアで実装されたミューテックスです。ただし、非常に少数の操作しかアトミックに実行できません。
は、次の同等の擬似コードを考えてみましょう:
mutex global_mutex;
void InterlockedAdd(int& dest, int value) {
scoped_lock lock(mutex);
dest += value;
}
int InterlockedRead(int& src) {
scoped_lock lock(mutex);
return src;
}
void InterlockedWrite(int& dest, int value) {
scoped_lock lock(mutex);
dest = value;
}
これらの機能は、CPUによって命令として実装され、彼らは様々な程度に、スレッド間の一貫性を保証しています。正確なセマンティクスは問題のCPUに依存します。 x86は逐次整合性を提供します。これは、オペレーションがある順序で連続して発行されたかのように動作することを意味します。これは明らかに少しをブロックすることを含む。
あなたは、アトミック操作がmutexの観点から実装できること、またはその逆を正確に推測することができます。しかし、通常、アトミックオペレーションはハードウェアによって提供され、次にミューテックスやその他の同期プリミティブがオペレーティングシステムによって実装されます。これは、完全なミューテックスを必要とせず、「ロックレス」として知られているものを操作できるアルゴリズムがいくつか存在するためです。つまり、スレッド間の一貫性のためにアトミック操作を使用するだけです。
これは質問に答えません。 2つのスレッドが同時に「読み込みとスワップ」を行う場合はどうでしょうか?そして、両方とも戻ります。 – user1146657
@ user1146657: "ロックと交換"操作のポイントは、*アトミック*であり、CPUは常に1つのスレッドだけがそれを実行できることを保証します。定義上、2つのスレッド*は同時にそれを行うことはできません。 CPUは、この目的のためにそのように動作するように特別に設計されています。 –