Mutex

mutex 불변식 보호

mutex와 lock은 공유 상태를 동시에 바꾸지 못하게 한다. 보호해야 할 것은 변수 하나가 아니라 여러 값이 함께 만족해야 하는 조건이다.

01

공유 상태 탐색

여러 스레드가 동시에 읽고 쓰는 값과 그 값 사이의 조건을 묶어 본다.

02

잠금 범위 축소

검증과 갱신은 잠금 안에 두되, 오래 걸리는 I/O나 callback 호출은 밖으로 뺀다.

03

락 획득 순서 통일

두 개 이상의 mutex를 잡아야 하면 항상 같은 순서 또는 std::scoped_lock을 사용한다.

lock_guard
단순 스코프 잠금 생성 시 lock, 소멸 시 unlock을 수행한다.
대부분의 짧은 구간에 충분하다.
unique_lock
유연한 잠금 unlock, relock, 조건 변수 대기에 필요하다.
조금 더 무겁지만 제어가 가능하다.
scoped_lock
여러 mutex 안전 잠금 deadlock을 피하도록 여러 mutex를 한 번에 잡는다.
C++17부터 사용 가능하다.
atomic
단일 값 동기화 독립적인 카운터나 플래그에는 mutex보다 간단할 수 있다.
복합 불변식에는 mutex가 낫다.

보호 단위 · 잠금 중 호출 · 잠금 순서 점검

보호 단위 관련된 여러 값을 서로 다른 mutex로 보호해 불변식이 찢어지지 않는가.
잠금 중 호출 잠금 상태에서 외부 callback이나 느린 I/O를 호출하지 않는가.
잠금 순서 두 mutex를 잡는 모든 경로가 같은 순서를 지키는가.

불변식 보호

std::mutex m;
std::vector<Job> queue;

void push(Job job) {
    std::lock_guard<std::mutex> lock(m);
    queue.push_back(std::move(job));
}