1.16.5 잠금의 전염성으로 발생한 실수

    잠금으로 보호되는 리소스(변수 값 등)에서 얻어 온 값이나 포인터 주소 값 등이 로컬 변수로 있는 경우에도 잠금 상태를 계속 유지해야 할 때가 있습니다. 이를 잠금의 전염성이라고 하겠습니다.

    class A
    {
      int x;
      int y;
    };
     
    mutex list_mutex;
    List<A> list;
     
    void func()
    {
      lock(list_mutex);
      A* a = list.GetFirst(); 
      unlock(list_mutex);
     
      a->x++; // 문제가 되는 부분
    }

    예시 코드를 볼까요? 목록에서 A 객체를 하나 꺼내 옵니다. 그리고 A의 포인터 주소 값이 로컬 변수로 남아 있습니다. 이 상태에서 목록을 보호하는 잠금을 해제합니다.

    목록 자체는 잠금으로 보호되고 있으나, 목록의 항목 하나를 가리키는 로컬 변수 a가 있고 이 로컬 변수에 대해 읽기/쓰기를 하고 있습니다. 즉, 목록의 잠금은 그 로컬 변수로 전염된 상태입니다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.