4章スピンロックの実装

通常のMutex(「1.7 ロック:MutexとRwLock」参照)をロックする場合、そのMutexがすでにロックされていたらスレッドはスリープする。こうすることでMutexがリリースされるまでの間、資源を浪費することを避ける。しかし、Mutexがロックされる時間が非常に短く、スレッドが別のプロセッサコアで並列に実行できる場合には、スリープせずに繰り返してロックを試みるようにした方がいい場合もある。

スピンロックは、まさにこのように動作するMutexだ。すでにロックされているMutexをロックしようとした場合、ビジーループ(busy-looping)もしくはスピン(spinning)する、つまり成功するまで何度もロックの取得を試みる。プロセッササイクルを浪費することになるが、ロックのレイテンシを短縮できる場合がある。

[注記]

std::sync::Mutexも含めて、いくつかのプラットフォームで実際に用いられているMutexの実装の多くは、OSにスレッドのスリープを依頼する前に、短時間だけスピンロックのように動作する。これは、2つの手法の利点を組み合わせようという試みだが、その効果は場合によって異なる。

本章では、「2章 アトミック操作」「3章 メモリオーダリング」で学んだことを応用して、独自のSpinLock型を実装し、Rustの型システムを用いて安全で使いやすいインターフェイスを提供する方法を説明する。

4.1 最小限の実装

スピンロックをゼロから実装してみよう。 ...

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.