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