1.16.3 너무 좁은 잠금 범위
잠금 객체 범위가 너무 넓으면 컨텍스트 스위치가 발생할 때 운영체제가 해야 할 일이 매우 많아집니다. 그리고 처리 병렬성이 떨어지기 때문에 멀티스레드 프로그래밍의 이유가 퇴색되기도 합니다.
잠금 범위를 좁히면 컨텍스트 스위치의 확률이 떨어지기는 합니다. 그러나 임계 영역 잠금이 컨텍스트 스위치보다는 훨씬 적더라도 단순한 산술 연산보다는 더 많은 처리 시간을 차지합니다.9 따라서 임계 영역을 적당한 수준에서 나누면 좋습니다.
class A { int a; mutex a_mutex; int b; mutex b_mutex; };
이 예시 코드는 클래스 멤버 변수 각각에 잠금을 하고 있습니다. 지나치게 잘게 자른 케이스입니다.
9 임계 영역 잠금과 잠금 해제는 1회 이상의 원자 조작(atomic operation)을 합니다. 원자 조작은 통상적인 메모리 액세스보다 시간을 몇 배나 차지합니다. 여러 CPU가 같은 메모리를 원자 조작하는 경우 시간이 수십 배 걸리기도 합니다.