std::mutex::lock()
メンバー関数は、c++11 標準 (ドラフト n3337) のnoexcept
セクション30.4.1.2 Mutex 型の第 6 節のように宣言されていません。
式m.lock()
は整形式であり、次のセマンティクスを持つ必要があります。
- ...
- スロー:
system_error
例外が必要な場合 (30.2.2)。
- エラー条件:
operation_not_permitted
— スレッドが操作を実行する権限を持っていない場合。
resource_deadlock_would_occur
— デッドロックが発生することを実装が検出した場合。
device_or_resource_busy
— ミューテックスがすでにロックされていて、ブロックできない場合。
これは、その関数が例外自体を処理でき、呼び出し元への伝播を防止しない限り、を使用する関数はmutex::lock()
マークできないことを意味します。noexcept
これらのエラー状態が発生する可能性についてコメントすることはできませんが、std::mutex
and resource_deadlock_would_occur
(スローされる可能性がある) に関連して、スレッドが試行した場合にこのエラーがstd::mutex
発生する可能性があるため、ランタイムの失敗ではなく、コードのバグを示します。すでに所有しているa をロックします。セクション30.4.1.2.1 Class mutex、節 4 から:
[ 注: ミューテックス オブジェクトを所有するスレッドがそのオブジェクトに対して lock() を呼び出すと、プログラムがデッドロックする可能性があります。実装がデッドロックを検出できる場合、resource_deadlock_would_occur エラー状態が観察されることがあります。—終わりのメモ]
ロック タイプとして選択することにより、プログラマは、同じスレッドが既にロックされているスレッドをロックしようとする試みが不可能であることstd::mutex
を明示的に示しています。mutex
スレッドが a を再ロックする正当な実行パスである場合は、mutex
astd:recursive_mutex
がより適切な選択です (ただし、a に変更しても、関数に例外recursive_lock
がないというわけではありません)。lock()