10章アイディアとインスピレーション

並行性に関するトピック、アルゴリズム、データ構造、小話などはいくらでもあり、これらの章を独立に設けてもよかっただろう。しかし、この10章が最後の章で、そろそろ読者とたもとを分かつときだ。読者には、新しい可能性に対する興奮と、実用的に応用できる新たな知識と技術を与えられたと思う。

10.1 セマフォ

セマフォは2つの操作だけを持つカウンタにすぎない。シグナル(signal)(upもしくはVとも呼ばれる)とウェイト(wait)(downもしくはPとも)の2つだ。シグナル操作は、カウンタをある上限値までインクリメントし、ウェイト操作はデクリメントする。カウンタの値が0なら、ウェイト操作はブロックし、対応するシグナル操作が来るのを待機する。したがってカウンタの値は負にはならない。セマフォは柔軟なツールで、他の同期プリミティブを実装するためにも用いられる。

セマフォ

図10-1 セマフォ

セマフォは、カウンタに用いるMutex<u32>と、ウェイト操作の待機に用いるCondvarを組み合わせれば実装できる。しかし、もっと効率的に実装する方法がいくつかある。特に、futexスタイルの操作(「8.3.1 Futex」)をサポートしているプラットフォームでは、1つのAtomicU32で効率的に実装できる(AtomicU8でも可能)。

最大値を1としたセマフォはバイナリセマフォ(binary semaphore)とも呼ばれ、他のプリミティブを構築する際の構成要素として用いられる。例えば、カウンタを1に初期化し、ウェイト操作をロックに、シグナル操作をアンロックに用いればMutexになる。カウンタを0に初期化すれば、条件変数のようにシグナルを送るために使うこともできる。例えば、標準ライブラリ ...

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.