더북(TheBook)

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가 있고 이 로컬 변수에 대해 읽기/쓰기를 하고 있습니다. 즉, 목록의 잠금은 그 로컬 변수로 전염된 상태입니다.

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