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의 스코프를 벗어나면 자동으로 락이 해제됨
'프로그래밍 > C++' 카테고리의 다른 글
C++ ] 문자열 탐색 및 조작 함수, find() 외 (0) | 2024.06.11 |
---|---|
C++ ] std::condition_variable 사용법 (0) | 2024.05.12 |
C++ ] std::unordered_map과 std::map의 차이, unordered_map의 사용법 (0) | 2024.04.26 |
C++ ] std::set 사용법 (0) | 2024.04.22 |
C++ ] std::iota 사용법 (0) | 2024.04.19 |