Несколько блокировок, блокирующих одни и те же функции C # .Net - PullRequest
0 голосов
/ 20 марта 2012

У меня простой вопрос о блокировке. Являются ли Process1 и Process2 одинаковыми, потому что они в конечном итоге блокируют LongProcess? Спасибо.

private static readonly object _Locker = new object();  
public void Process1()  
{  
    lock(_LockerA){  
        LongProcess()  
    }
}

public void Process2()  
{  
    if(curType == A)
        ProcessTypeA();
    else if(curtype == B)  
        ProcessTypeB();
}

private static readonly object _LockerA = new object();  
public void ProcessTypeA()  
{      
    lock(_LockerA){  
        LongProcess()  
    }
}

private static readonly object _LockerB = new object();  
public void ProcessTypeB()  
{      
    lock(_LockerB){  
        LongProcess()  
    }
}

public void LongProcess()  
{  
}

Ответы [ 2 ]

0 голосов
/ 20 марта 2012

Process1 и Process2 могут заблокировать один и тот же объект, но они определенно не одинаковы. Однако блокировки на один и тот же объект разрешены (я думаю, редко, если когда-либо приходилось это делать) в пределах одного стека вызовов (также называемого рекурсивной блокировкой в случае, когда Process1 вызывает Process2) , Вероятно, это лучше описать как зависимая блокировка.

Ваш вопрос, однако, довольно расплывчатый, поэтому вам придется уточнить, что вы подразумеваете под тем же ...

0 голосов
/ 20 марта 2012

Нет, они не одинаковы. Если вы заблокируете объект, отличный от уже существующей блокировки, то будут разрешены оба пути кода. Так, в случае Process2 curtype == 'b' блокировка использует объект _LockerB. Если предпринята попытка одной из других блокировок с использованием объекта _LockerA, им будет разрешено ввести LongProcess.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...