안녕하세요,
재재입니다.
이번에는 c++ mutex 제어하기 위해 많이 사용하는,
c++ unique_lock 과 lock_guard 차이에 대해서 다루어볼게요!
(1) c++ unique_lock 이란?
c++ unique_lock 은 mutex 제어를 위해 사용하는 것 중 하나입니다.
unique_lock 을 사용하면 mutex 에 대한 lock 을 획득 할 수 있으며,
중간에 lock 을 해제할 수 있습니다. 다만, unique lock 은 역할이 끝나면 자동으로 해제되며,
lock -> unlock -> lock -> unlock 와 같이 반복해서 사용이 가능합니다.
특히, c++ unique_lock 은 RAII 원칙을 따릅니다.
https://en.cppreference.com/w/cpp/thread/unique_lock
https://en.cppreference.com/w/cpp/thread/lock_guard
(2) c++ lock_guard 란?
c++ unique_lock 과 같이 lock_guard 도 mutex 제어에 사용됩니다.
c++ lock_guard 는 임의로 lock 을 해제 할 수 없으며,
해당 연산 (스코프) 가 끝나면 자동으로 해제됩니다.
unique_lock 과 달리 예외가 발생하면 자동으로 lock 을 해제해서,
deadlock 과 같은 문제가 발생하지 않는 장점이 있습니다.
(3) c++ unique_lock vs lock_guard
표로 한번 정리해봤습니다.
std::unique_lock | std::lock_guard | |
소유권 (ownership) | lock 을 다시 획득하는 게 가능함. | 한번 lock 을 잃으면 다시 획득 할 수 없음. |
해제 | 자동으로 해제되기도 하나, 필요시 중간에 해제가 가능함. | 자동으로 해제됨. |
예외처리 | 세부적으로 제어가 필요 할 수 있으며, deadlock 이 발생 할 수 있음. | 자동으로 처리가 되며, deadlock 이 발생하지 않음. |
사용 가능 mutex | std::mutex, std::shared_mutex, std::recursive_mutex, … | std::mutex |
(4) 결론
std::unique_lock 과 std::lock_guard 는 각 용도에 맞게 사용되어야 합니다.
조금 더 세밀하게 제어하면서 사용 할 수 있다면 unique_lock 을 추천 드리며,
그렇지 않은 경우에는 lock_guard 를 통해 mutex 제어에 입문해보시는 것은 어떨가요?