2章アトミック操作
アトミックという言葉は、ギリシャ語で不可分を意味するἄτομοςから来ていて、それ以上細かく分割できないものを指す。コンピュータサイエンスの世界では、この言葉は不可分な操作を意味する。つまり、完全に完了するか、全く行われないかのどちらかしか起こらない。
「1.4 借用とデータ競合」で説明したように、複数のスレッドが並行して同じ変数を読み込んで更新すると、通常は未定義の動作になる。しかし、アトミック操作を用いれば複数のスレッドが安全に同じ変数を読み込んで更新することができる。アトミック操作は不可分なので、他の操作の前に完全に行われるか、後に完全に行われるかのどちらかだ。これによって、未定義の動作を避けることができる。「7章 プロセッサを理解する」でこれがハードウェアレベルでどのように実現されているかを説明する。
アトミック操作は、複数のスレッドを用いて何らかのコードを書く際の基本的な構成要素である。Mutexや条件変数などの、他の並行プリミティブはすべて、アトミック操作を用いて実装されている。
Rustではアトミック操作は、std::sync::atomic
にある標準のアトミック型のメソッドとして提供されている。これらの型は、AtomicI32
やAtomicUsize
のように、すべてAtomic
で始まる。使用できる型は、ハードウェアアーキテクチャや、場合によってはオペレーティングシステムに依存するが、ほとんどすべてのプラットフォームで、少なくともポインタのサイズまでのアトミック型は利用できる。
ほとんどの型と異なり、アトミック型は共有参照を通して変更することができる(例えば、&AtomicU8
)。「1.5 内部可変性」で説明したように、これが可能なのは内部可変性のおかげだ。 ...
Get 詳解 Rustアトミック操作とロック ―並行処理実装のための低レイヤプログラミング now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.