Programing

잠금 내부 잠금

crosscheck 2020. 12. 13. 08:57
반응형

잠금 내부 잠금


이 구성으로 인해 오류가 발생하는지 궁금합니다.

lock(sync)
{
  // something
  lock(sync)
  {
    //something
    lock(sync)
    {
      //something
    }
  }
}

이 코드를 실행했는데 괜찮아 보이지만 상황에 따라 오류가 발생할 수 있습니까?


lockMonitor.Enter및에 대한 래퍼입니다Monitor.Exit .

lock키워드는 호출 Enter블록의 시작과 Exit블록의 끝에서. 전자 문서에서 :

에 대한 문서에서Monitor.Enter :

동일한 스레드가 Enter차단하지 않고 두 번 이상 호출하는 것은 합법적입니다 . 그러나 Exit객체에서 대기중인 다른 스레드가 차단 해제되기 전에 동일한 수의 호출 호출되어야합니다.

Enter호출 Exit이 쌍을 이루기 때문에 코드 패턴은 잘 정의 된 동작을 갖습니다.

그러나 lock예외가없는 구조라고 보장 할 수는 없습니다.

A ThreadInterruptedException명령문 Interrupt입력을 기다리는 스레드를 인터럽트하는 경우 발생합니다 lock.


잘 정의 된 동작이고 절대 실패하지 않는 이유를 설명하려면 :

곁에 : 이 답변에는 잠금이 실제로 작동하는 방법에 대한 자세한 내용이 있습니다.

잠금은 Thread레벨 에서 발생 하므로 동일한 스레드에서 두 번째로 호출하면 중복됩니다. .Net의 내부가 정확히 어떻게 작성되었는지에 따라 성능이 저하되지는 않을 것이라고 생각하므로 보장 할 수 없습니다.

클래스에서 다른 공용 함수를 호출하는 공용 함수가 여러 번 있는데, 둘 다 별도로 사용하면 잠금이 필요합니다. 이것이 허용되지 않으면 다음이 실패합니다.

private Dictionary<string, int> database = new Dictionary<string, int>();
private object databaseLock = new object();
public void AddOrUpdate(string item)
{
    lock (databaseLock)
    {
        if (Exists(item))
            database.Add(item, 1);
        else
            ++database[item];
    }
}
public bool Exists(string item)
{
    lock (databaseLock)
    {
        //... Maybe some pre-processing of the key or item...
        return database.ContainsKey(item);
    }
}

MSDN ( 여기여기 참조)에 따르면 이것은 잘 정의 된 동작이며 문제를 일으키지 않습니다.

참고 URL : https://stackoverflow.com/questions/9172934/lock-inside-lock

반응형