본문 바로가기
프로그래밍/C++

C++ ] std::unique_lock과 std::lock_guard의 차이

by eteo 2024. 5. 4.

 

 

std::unique_lock과 std::lock_guard의 차이

 

std::unique_lock과 std::lock_guard 모두 스코프 기반의 락 관리를 제공한다. 객체가 스코프에 진입할 때 자원을 획득(락을 잠금)하고, 스코프를 벗어날 때 소멸자를 호출해 자동으로 자원을 해제(락을 해제)하는 방식이다. 사용자가 { }를 사용하여 직접 스코프를 지정하는 패턴으로 사용할 수도 있다.

 

둘의 차이점은 다음과 같다.

 

  • std::lock_guard : 생성될 때 자동으로 락을 획득하고 소멸될 때 락을 해제한다. 도중에 수동으로 락을 잠그거나 풀 수 있는 기능을 제공하지 않는다.
  • std::unique_lock : 생성될 때 자동으로 락을 획득하고 소멸될 때 락을 해제하며 lock(), unlock() 메소드를 사용하면 스코프 내에서도 락을 수동으로 해제하고 재잠금할 수 있다.

 

즉, 락의 해제와 잠금을 여러 번 수행해야 하는 복잡한 동기화 로직이 필요하거나 std::condition_variable과 함께 사용할 때는 std::unique_lock를 사용하는 것이 적합하고, 단순히 스코프 단위로 락을 적용하고 싶을 때는 std::lock_guard를 사용하는 편이 적합하다.

 

 

unique_lock<mutex> 사용 예시

std::mutex mtx;
{
    std::unique_lock<std::mutex> lck(mtx);
    // 여기서는 lck가 잠겨 있음

    // 필요한 작업 수행

    lck.unlock(); // 수동으로 락을 해제할 수 있음

    // 락이 해제된 상태에서 수행할 작업

    lck.lock(); // 수동으로 다시 락을 잠금

    // 락이 다시 잠긴 상태에서 수행할 작업
}
// lck의 스코프를 벗어나면 자동으로 락이 해제됨

 

 

 

lock_guard<mutex> 사용예시

std::mutex mtx;
{
    std::lock_guard<std::mutex> lck(mtx);
    // 여기서는 lck가 잠겨 있음

    // 필요한 작업 수행
}
// lck의 스코프를 벗어나면 자동으로 락이 해제됨