C# 在两种方法中对对象使用互斥体
我的问题是,如果我在两个不同的方法中有两条关键路径,那么第二个方法中的锁是否尊重第一个方法中的锁 作为下面虚拟代码中的一个示例,如果线程A调用C# 在两种方法中对对象使用互斥体,c#,.net,multithreading,concurrency,mutex,C#,.net,Multithreading,Concurrency,Mutex,我的问题是,如果我在两个不同的方法中有两条关键路径,那么第二个方法中的锁是否尊重第一个方法中的锁 作为下面虚拟代码中的一个示例,如果线程A调用method1,线程B调用method2,那么线程B在进入method2中的关键路径之前是否等待线程A释放锁 private static readonly object mylock = new object(); public void method1() { lock(mylock) { // critical p
method1
,线程B调用method2
,那么线程B在进入method2
中的关键路径之前是否等待线程A释放锁
private static readonly object mylock = new object();
public void method1()
{
lock(mylock)
{
// critical path 1
}
}
public void method2()
{
lock(mylock)
{
// critical path 2
}
}
简言之,是的。
lock
关键字接受对象实例作为标识锁的标记。这并不意味着实例本身可以避免多线程访问的危险。相反,它只是用来唯一标识在此受保护状态下执行的一个或多个代码段。使用同一对象实例的受锁保护的两个或多个代码段将保证以没有两个执行流临时共存的方式执行。换句话说,在您的示例中,关键路径1和2保证不会同时发生,因为您使用了相同的对象实例来定义代码区域。是的,如果锁定对象
相同,则会发生锁定。锁定是我尝试这样做时遇到的问题。我开始改用System.Threading.Mutex。或者也许我的代码有点错误…@butterbox:如果在同一个过程中,使用lock
或者,如果需要更好的控制,使用System.Threading.Monitor
(这就是lock
所使用的)。只有在需要跨进程时才使用System.Threading.Mutex
。