私の理解をテストするために次のコードを書きましたstd::mutex
int main() {
mutex m;
m.lock();
m.lock(); // expect to block the thread
}
そして、私はsystem_error: device or resource busy
. 2番目m.lock()
はスレッドをブロックするはずではありませんか?
私の理解をテストするために次のコードを書きましたstd::mutex
int main() {
mutex m;
m.lock();
m.lock(); // expect to block the thread
}
そして、私はsystem_error: device or resource busy
. 2番目m.lock()
はスレッドをブロックするはずではありませんか?
からstd::mutex
:
呼び出しスレッドは、lock または try_lock を呼び出す前にミューテックスを所有してはなりません。
とからstd::mutex::lock
:
既にミューテックスを所有しているスレッドによってロックが呼び出された場合、プログラムはデッドロックする可能性があります。あるいは、実装がデッドロックを検出できる場合、resource_deadlock_would_occur エラー状態が観察されることがあります。
および例外節:
エラーが発生した場合、std::system_error をスローします。これには、ロックがその仕様を満たすのを妨げる基礎となるオペレーティング システムからのエラーが含まれます。例外がスローされた場合、ミューテックスはロックされません。
したがって、スレッドをブロックすることは想定されていません。あなたのプラットフォームでは、実装は、スレッドがすでにロックの所有者であることを検出して例外を発生させることができるようです。説明に示されているように、これは他のプラットフォームでは発生しない可能性があります。
2番目
m.lock()
はスレッドをブロックするはずではありませんか?
いいえ、未定義の動作をします。2 番目m.lock()
はこの要件を破っています。
C++11 30.4.1.2/7 必須: m が
std::mutex
or型の場合std::timed_mutex
、呼び出しスレッドはミューテックスを所有していません。
あなたの実装は、呼び出し元のスレッドがミューテックスを所有していることを検出でき、エラーが発生したようです。他のものは無期限にブロックするか、他の方法で失敗する可能性があります。
(std::mutex
この回答を書いたとき、質問には言及されていませんでした。)
使用しているミューテックス ライブラリとミューテックス タイプに依存します。一部のシステムは、同じスレッドから発生した場合にのみ、このように複数回呼び出すことができる「再帰的ミューテックス」を提供します (別のスレッドがロックする前に、一致する数のロック解除が必要です)、他のライブラリはこれをエラーと見なします(あなたのように)正常に失敗するか、未定義の動作をする可能性があります。