Skip to content

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

컨텍스트 스위칭을 막는 코드는 아래와 같다.

std::unique_lock unique(_msg_locker, std::defer_lock);
while (_msg_locker.try_lock() == false) { };

복수의 Mutex 객체를 동시에 Lock 걸기

std::unique_lock unique1(_draw_locker, std::defer_lock);
std::unique_lock unique2( _msg_locker, std::defer_lock);
std::lock(unique1, unique2);

Favorite site