原子はギリシャ語の ἄτομος (atomos) に由来し、「分割できない」を意味します。 (注意: 私はギリシャ語を話せないので、本当は別の意味かもしれませんが、語源を挙げているほとんどの英語話者はこのように解釈しています。:-)
コンピューティングでは、これは操作が発生することを意味します。完了する前に目に見える中間状態はありません。そのため、CPU がハードウェア (IRQ) にサービスを提供するために中断された場合、または別の CPU が同じメモリを読み取っている場合、結果には影響しません。これらの他の操作は、完了または開始されていないことを観察します。
例として...変数を何かに設定したいとしましょう。ただし、それが以前に設定されていない場合のみです。あなたはこれをする傾向があるかもしれません:
if (foo == 0)
{
foo = some_function();
}
しかし、これを並行して実行するとどうなるでしょうか。プログラムが fetchを実行foo
し、それをゼロと見なしている間に、スレッド 2 が来て同じことを行い、値を何かに設定する可能性があります。元のスレッドに戻ると、コードはまだfoo
ゼロであると考えており、変数が 2 回割り当てられています。
このような場合、CPU は、アトミック エンティティとして比較と条件付き割り当てを実行できるいくつかの命令を提供します。したがって、テストと設定、比較と交換、およびロードリンク/ストア条件。これらを使用してロックを実装できます (OS と C ライブラリがこれを行っています)。または、プリミティブに依存して何かを行う 1 回限りのアルゴリズムを作成することもできます。(ここにはクールなことが行われていますが、ほとんどの単なる人間は、間違いを犯すことを恐れてこれを避けています。)