.net 为什么Monitor.Enter/Exit与lock()语句相比不可靠?
可靠地锁定关键截面和.net 为什么Monitor.Enter/Exit与lock()语句相比不可靠?,.net,multithreading,.net,Multithreading,可靠地锁定关键截面和 lock (mutexProviderService.GetMutex(lockName)) {} 这是不可靠的。手动调用使用相同实例参数确定调用的Enter/Exit有什么问题? 附带说明:MSDN中命名的互斥体代码比这个类大得多,也更复杂。这实际上并不是你问题的答案,但从c#4.0开始,lock生成下一个代码(阅读文章): 你说它不可靠是什么意思?您是否有一些测试场景来向我们展示此代码是如何失败的?如果看不到{}块中的内容,就很难判断。最明显的问题是,如果在您的Ent
lock (mutexProviderService.GetMutex(lockName)) {}
这是不可靠的。手动调用使用相同实例参数确定调用的Enter/Exit有什么问题?
附带说明:MSDN中命名的互斥体代码比这个类大得多,也更复杂。
这实际上并不是你问题的答案,但从c#4.0开始,
lock
生成下一个代码(阅读文章):
你说它不可靠是什么意思?您是否有一些测试场景来向我们展示此代码是如何失败的?如果看不到
{}
块中的内容,就很难判断。最明显的问题是,如果在您的Enter
和Exit
调用之间发生了lockName
变异,“不可靠”不是问题陈述。请非常清楚什么不起作用,以及您如何确定它不可靠。你需要确保阅读你文章的人和你一样知道发生了什么、失败、错误消息、执行了哪些代码等等。
lock (mutexProviderService.GetMutex(lockName)) {}
mutexProviderService.Enter(lockName);
try { }
finally
{
mutexProviderService.Exit(lockName);
}
bool lockWasTaken = false;
var temp = obj;
try
{
Monitor.Enter(temp, ref lockWasTaken);
{ body }
}
finally
{
if (lockWasTaken) Monitor.Exit(temp);
}