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만 줄이 넘는 상황에서 이러한 버그가 어딘가 생겨 버린다면, 여러분은 소스 컨트롤에서 히스토리 이진 검색 노동을 하거나 최악의 경우 백사장에서 바늘을 찾아야 할 수도 있습니다.