为什么Threading :: Monitor :: TryEnter不止一次成功?

时间:2012-06-11 16:18:26

标签: .net multithreading unit-testing c++-cli monitor

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

这样做虽然我遇到了一些意想不到的行为。当the docs指示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?!

2 个答案:

答案 0 :(得分:7)

文档说

  

同一个线程在没有的情况下多次调用Enter是合法的   阻止

请参阅http://msdn.microsoft.com/en-us/library/de0542zz(v=vs.110)

答案 1 :(得分:3)

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

因此,如果你是从不同的线程中创建的,我会期望第二个失败。