Std::unique lock
unique_lock는 쉽게 말하면 std::lock_guard에 기능이 더해진 것이라고 볼 수 있습니다. std::lock_guard의 경우 정의와 동시에 락을 걸고, 파괴될 때만 락을 풀 수 있습니다.
그에 비해 unique_lock은 정의와 동시에 락을 걸 수도 있고, 또는 뒤에 락을 걸 수도 있습니다. 또 락을 푸는 것도 원하는 대로 조절이 가능하며 try_lock, try_lock_for, try_lock_until 등도 지원합니다. 그리고 unique_lock끼리 소유한 뮤텍스 객체를 서로 교환도 할 수 있으며, 뮤텍스 객체를 얻거나 해제할 수도 있습니다.
간단한 경우에는 std::lock_guard가 사용하기 편하지만 뮤텍스를 다양하게 사용하고 싶은 경우에는 unique_lock이 훨씬 더 좋습니다.
Guard of the context switching
컨텍스트 스위칭을 막는 코드는 아래와 같다.
복수의 Mutex 객체를 동시에 Lock 걸기
std::unique_lock unique1(_draw_locker, std::defer_lock);
std::unique_lock unique2( _msg_locker, std::defer_lock);
std::lock(unique1, unique2);