11

私の理解をテストするために次のコードを書きましたstd::mutex

int main() {
    mutex m;
    m.lock();
    m.lock(); // expect to block the thread
}

そして、私はsystem_error: device or resource busy. 2番目m.lock()はスレッドをブロックするはずではありませんか?

4

3 に答える 3

15

からstd::mutex:

呼び出しスレッドは、lock または try_lock を呼び出す前にミューテックスを所有してはなりません。

とからstd::mutex::lock

既にミューテックスを所有しているスレッドによってロックが呼び出された場合、プログラムはデッドロックする可能性があります。あるいは、実装がデッドロックを検出できる場合、resource_deadlock_would_occur エラー状態が観察されることがあります。

および例外節:

エラーが発生した場合、std::system_error をスローします。これには、ロックがその仕様を満たすのを妨げる基礎となるオペレーティング システムからのエラーが含まれます。例外がスローされた場合、ミューテックスはロックされません。

したがって、スレッドをブロックすることは想定されていません。あなたのプラットフォームでは、実装は、スレッドがすでにロックの所有者であることを検出して例外を発生させることができるようです。説明に示されているように、これは他のプラットフォームでは発生しない可能性があります。

于 2013-05-21T07:27:48.463 に答える
9

2番目m.lock()はスレッドをブロックするはずではありませんか?

いいえ、未定義の動作をします。2 番目m.lock()はこの要件を破っています。

C++11 30.4.1.2/7 必須: m がstd::mutexor型の場合std::timed_mutex、呼び出しスレッドはミューテックスを所有していません。

あなたの実装は、呼び出し元のスレッドがミューテックスを所有していることを検出でき、エラーが発生したようです。他のものは無期限にブロックするか、他の方法で失敗する可能性があります。

于 2013-05-21T07:36:27.373 に答える
2

std::mutexこの回答を書いたとき、質問には言及されていませんでした。)

使用しているミューテックス ライブラリとミューテックス タイプに依存します。一部のシステムは、同じスレッドから発生した場合にのみ、このように複数回呼び出すことができる「再帰的ミューテックス」を提供します (別のスレッドがロックする前に、一致する数のロック解除が必要です)、他のライブラリはこれをエラーと見なします(あなたのように)正常に失敗するか、未定義の動作をする可能性があります。

于 2013-05-21T07:26:51.877 に答える