アトミック操作はどのようにしてスレッドセーフになりますか?ウィキペディアのスレッドセーフに関する記事でこのテーマについて読んだことがあります。しかし、この記事では、舞台裏のプロセスについては実際には説明されていませんでした。言い換えると、スレッドAによって実行される「アトミック」操作をスレッドBによって中断できないのはなぜですか。
3 に答える
アトミック操作は完了するか、まったく実行されません。他のスレッドは「進行中」の操作を表示できません。部分的に完了した状態で表示されることはありません。これは、この文脈で「アトミック」という言葉が意味することです。
それを実現するための舞台裏の魔法は、実装ごとに異なります。並行性の設計の目的で、信頼できるのは、実行時にオールオアナッシングを保証することだけです。
しかし、彼らは舞台裏のプロセスを実際には説明していませんでした。言い換えれば、スレッドAによって実行されたアトミック操作がスレッドBによって中断されなかったのはなぜですか?
彼らが舞台裏で何が起こっているのかを説明していない理由は、それが非常に実装固有であるためです。たとえば、実装プラットフォームでそのようなことを行うために利用できるハードウェア命令に依存します。
しかし、それについて心配する必要はありません。アトミック性(たとえば、非割り込み可能性)がどのように実装されているかを気にする必要はありません。AtomicXxxクラスAPIによって提供される、特定の操作がアトミックな方法で動作するという保証に依存し、それらの保証に基づいてより高いレベルのスレッドセーフを構築する必要があります。
ただし、AtomicXxxクラスの原子性プロパティは個々の操作にのみ適用されることに注意してください。一連のAtomicXxx操作はアトミックに実行されないため、自動的にスレッドセーフにはなりません。
つまり、AtomicXxxクラスを使用してスレッドセーフを実装する場合は、何をしているのかを理解する必要があります。
比較と設定は1つのマシン命令であるため、中断されることはありません。
その意味で、すべてのマシン命令はアトミックであり、あまり興味深いものではありません。たとえば、単純な書き込みは常にアトミックです。
「興味深い」不可分操作とは、直感的に2つ以上のステップで構成されているものの、比較と設定など、1つの不可分なステップとして実装されているものです。32ビットマシンでのlongの揮発性r/w。