2

私はいくつかのマルチスレッド コードを保護しようとしており、以前に見られた破損を修正したことを証明するために単体テストを追加している最中です。

そうすることで、予期しない動作に遭遇しました。関数が排他ロックを達成した場合にのみ true を返す必要があるとドキュメントに示されているのに、次のコードが成功するのはなぜですか?TryEnter

const int msToWaitForLock = 1;
Object^ syncObj = gcnew Object();
bool gotLock = Threading::Monitor::TryEnter(syncObj, msToWaitForLock); // <-- this succeeds as expected
bool gotSecondLock = Threading::Monitor::TryEnter(syncObj, msToWaitForLock); // <-- but why the heck does this succeed?!
4

2 に答える 2

7

ドキュメンテーションによると

ブロックすることなく、同じスレッドが Enter を複数回呼び出すことは合法です

http://msdn.microsoft.com/en-us/library/de0542zz(v=vs.110)を参照してください。

于 2012-06-11T16:22:29.477 に答える
3

質問に何かが欠けていない限り、同じスレッドから行われているため、これらの呼び出しの両方が成功するべきではありませんか?

したがって、別のスレッドからそれらを作成した場合、2 番目のスレッドは失敗すると予想されます。

于 2012-06-11T16:21:57.637 に答える