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に類似した基本的なウェイトとウェイク機能が利用できるようになる。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access