c#互斥体获取问题
有这样的代码:c#互斥体获取问题,c#,multithreading,mutex,C#,Multithreading,Mutex,有这样的代码: void MyMethod() { bool acquired = _lockMutex.WaitOne(WAITING_TIME_SPAN); if (acquired) { Proceed();//everything is ok } else { actionEnded("Mutex in use!"); } } _lockMutex是私有的静态作用域。当两个线程“同时”尝试在互斥空闲时获取互斥时,似乎没有一个线程当前获
void MyMethod() {
bool acquired = _lockMutex.WaitOne(WAITING_TIME_SPAN);
if (acquired) {
Proceed();//everything is ok
} else {
actionEnded("Mutex in use!");
}
}
_lockMutex是私有的静态作用域。当两个线程“同时”尝试在互斥空闲时获取互斥时,似乎没有一个线程当前获取互斥。你能解释一下为什么吗?谢谢看起来像是什么?你有什么证据?我肯定只希望有一个线程可以获得它,而你还没有给出足够的诊断来提出其他建议。你有第三个线程锁定互斥锁并“忘记”释放它吗?这将是一个令人讨厌的死锁,但很容易修复。@JonSkeet我曾经有过类似的锁问题。调试器显示有两个线程正在等待
锁定(lockobject)
。其他线程与锁无关。好了,明白了,这是我的错——在方法的一个分支中,我没有释放互斥锁。我发布这篇文章只是想问是否有可能在某些时候非竞争线程可以获得互斥-显然是愚蠢的问题,答案是否定的:)。很抱歉打扰您。关于互斥体(以及lock关键字/Monitor类)的警告:一旦线程获得互斥体,对WaitOne的任何其他调用都不会被阻止,您需要调用ReleaseMutex的次数与调用WaitOne的次数相同(请参阅上的备注)。我通常更喜欢使用信号量来确保重复的WaitOne调用将被阻塞,因为嵌套线程同步调用通常指向代码中的其他问题。