2

我正在尝试保护一些多线程代码,并且正在添加单元测试以证明我已经修复了我们之前看到的损坏。

这样做虽然我遇到了一些意想不到的行为。当文档指示TryEnter仅在函数实现排他锁时才应返回 true 时,为什么以下代码会成功?

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

除非我在问题中遗漏了一些东西,否则这两个调用不应该成功吗,因为它们是由同一个线程制作的?

因此,如果您从单独的线程中制作它们,我预计第二个会失败。

于 2012-06-11T16:21:57.637 回答