더북(TheBook)

1.16.1 읽기와 쓰기 모두에 잠금하지 않기

먼저 멀티스레드 프로그래밍을 시작하는 사람들에게서 흔히 볼 수 있는 실수를 알아봅시다. 이 경우는 메모리에 값을 쓰고 있는데 다른 스레드가 그것을 읽으면 망가질 수 있다는 것은 인지하지만, 그냥 값을 읽고만 있으면 잠금을 하지 않더라도 안전하다는 막연한 생각 때문에 발생합니다.

int a;
mutex a_mutex;
 
void func1()
{
  // lock(a_mutex); 누락
  print(a);
}
 
void func2()
{
  lock(a_mutex);
  a = a + 10;
}

이 예시는 크래시를 일으키지는 않습니다. 그렇지만 func1()에서 읽어 들이는 a 값이 가끔 정상적이지 않다는 버그가 있습니다(항상이 아니라 가끔 생기는 버그입니다). 이 예시처럼 단순한 프로그램이 아니라 소스 코드 100만 줄이 넘는 상황에서 이러한 버그가 어딘가 생겨 버린다면, 여러분은 소스 컨트롤에서 히스토리 이진 검색 노동을 하거나 최악의 경우 백사장에서 바늘을 찾아야 할 수도 있습니다.

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