9章ロックの実装
本章では、Mutex、条件変数、リーダ・ライタ・ロックを独自実装する。まず、それぞれの基本的なバージョンを実装し、それからより効率の良いものに拡張していく。
標準ライブラリのロック型は使わない(使ったらインチキになる)ので、ビジーループを用いずにスレッドを待機させるためには、「8章 OSプリミティブ」で紹介したツールを用いなければならない。しかし、説明したように、OSが提供するツールはプラットフォームによって大きく異なるので、どのプラットフォームでも動作するものを作るのは難しい。
幸い、ほとんどの近代的なOSはfutexに類似した機能をサポートしている。少なくともウェイク操作とウェイト操作はサポートする。「8章 OSプリミティブ」で説明したように、Linuxはfutex
システムコールを2003年からサポートしている。WindowsはWaitOnAddress
関数ファミリーを2012年からサポートしている。FreeBSDは_umtx_op
システムコールを2016年からサポートしている。
最も大きな例外はmacOSだ。macOSのカーネルはこれらの操作をサポートしているのだが、それを、我々が使えるような、安定した誰でも使えるC関数として公開していないのだ。しかし、macOSは最新のlibc++を同梱している。libc++は、C++標準ライブラリの実装だ。このライブラリはC++20をサポートしているが、C++20では、最も基本的なアトミックなウェイト操作とウェイク操作が組み込み関数としてサポートされている(std::atomic<T>::wait()
など)。これをRustから使用するのは、さまざまな理由でなかなか大変なのだが、可能ではある。これを使うことで、macOSでもfutexに類似した基本的なウェイトとウェイク機能が利用できるようになる。 ...
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.