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-> ++; // 문제가 되는 부분 }
예시 코드를 볼까요? 목록에서 A 객체를 하나 꺼내 옵니다. 그리고 A의 포인터 주소 값이 로컬 변수로 남아 있습니다. 이 상태에서 목록을 보호하는 잠금을 해제합니다.
목록 자체는 잠금으로 보호되고 있으나, 목록의 항목 하나를 가리키는 로컬 변수 a가 있고 이 로컬 변수에 대해 읽기/쓰기를 하고 있습니다. 즉, 목록의 잠금은 그 로컬 변수로 전염된 상태입니다.