yohhoyの日記

技術的メモをしていきたい日記

shared_(timed_)mutexがサポートするReaderスレッド数

C++14標準ライブラリのshared_timed_mutexクラス*1は、少なくとも10000スレッド以上のReaderスレッドからの共有ロック(shared lock)同時獲得をサポートする。また同時獲得可能な共有ロック数上限を超えた場合も、共有ロック獲得できるまでReaderスレッドがブロックされると保証する。*2

C++14 30.4.1.4/p2より引用(下線部は強調)。

In addition to the exclusive lock ownership mode specified in 30.4.1.2, shared mutex types provide a shared lock ownership mode. Multiple execution agents can simultaneously hold a shared lock ownership of a shared mutex type. But no execution agent shall hold a shared lock while another execution agent holds an exclusive lock on the same shared mutex type, and vice-versa. The maximum number of execution agents which can share a shared lock on a single shared mutex type is unspecified, but shall be at least 10000. If more than the maximum number of execution agents attempt to obtain a shared lock, the excess execution agents shall block until the number of shared locks are reduced below the maximum amount by other execution agents releasing their shared lock.

おまけ:自作のMutexコレクションでは、C++11環境向けのshared_(timed_)mutexプリミティブを実装している。Boost.Threadライブラリではshared_mutexや、より高機能なupgrade_mutexを提供する。

関連URL

*1:タイムアウトをサポートしない shared_mutex はC++1z(C++17)標準ライブラリで追加される予定。N3891参照。

*2:個人的な感想として、共有ロック数獲得上限を超えたときも未規定(unspecified)でなはいことに小さな驚きがある。最低10000スレッドもサポートしていれば実用上は該当条件にかかることも無いだろうが、内部実装にSpinlock方式を採用する場合には少々面倒な要件な気がする。そもそもC++標準ライブラリ実装でSpinlock方式が採用されることは無いか…