18

この記事に従って:

間にロックを解除せずに、同じスレッドから非再帰的ミューテックスを 2 回ロックしようとすると、未定義の動作が発生します。

私の非常に素朴な心は、なぜ彼らは単にエラーを返さないのかを教えてくれます. これがUBでなければならない理由はありますか?

4

2 に答える 2

33

正しいプログラムでは決して発生しないため、発生しないことをチェックするのは無駄です (そして、そのチェックを行うには、所有スレッド ID を格納する必要があり、これも無駄です)。

未定義であると、たとえば、リリースの実装を可能な限り効率的にしながら、デバッグの実装で例外をスローできることに注意してください。

于 2012-06-23T22:41:06.673 に答える
16

未定義の動作により、実装は最速/最も便利なことを何でも行うことができます。たとえば、非再帰的ミューテックスの効率的な実装は、ロック操作がループ内のアトミックな比較とスワップ命令で実装される単一ビットである可能性があります。ミューテックスを所有するスレッドが再度ロックしようとすると、ミューテックスのロックが解除されるのを待っているためデッドロックになりますが、他の誰もロックを解除できないため (所有していないスレッドがロックを解除する他のバグがない限り)、スレッドは永遠に待機します。

于 2012-06-23T22:53:30.403 に答える