yohhoyの日記

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

mutexのconstexprコンストラクタ

C++11標準ライブラリのミューテックスクラス群においてstd::mutexのみがconstexprデフォルトコンストラクタをもつ。

N3337 30.4.1.2.1, 30.4.1.2.2, 30.4.1.3.1, 30.4.1.3.2よりコンストラクタ宣言のみ引用。

30.4.1.2.1 Class mutex

class mutex {
  constexpr mutex() noexcept;

30.4.1.2.2 Class recursive_mutex

class recursive_mutex {
  recursive_mutex();

30.4.1.3.1 Class timed_mutex

class timed_mutex {
  timed_mutex();

30.4.1.3.2 Class recursive_timed_mutex

class recursive_timed_mutex {
  recursive_timed_mutex();

これにより非ローカルなstd::mutex型変数の初期化は静的初期化(static initialization)として扱われ、任意の他スレッド開始(=std::thread型変数の動的初期化)よりも前にmutexオブジェクトが初期化済みである事が保証される。N3337 3.6.2/p2より該当箇所のみ引用。

Constant initialization is performed:

  • (snip), if the constructor is a constexpr constructor, (snip)

Together, zero-initialization and constant initialization are called static initialization; all other initialization is dynamic initialization. Static initialization shall be performed before any dynamic initialization takes place. (snip)

この仕様はPOSIXスレッドライブラリのPTHREAD_MUTEX_INITIALIZER定数マクロに対応する。

関連URL