unique_lock는 쉽게 말하면 lock_guard에 기능이
더해진 것이라고 볼 수 있습니다.
lock_guard의 경우 정의와 동시에 락을 걸고, 파괴될
때만 락을 풀 수 있습니다.
그에 비해 unique_lock은 정의와 동시에 락을 걸 수도 있고, 또는 뒤에
락을 걸 수도 있습니다. 또 락을 푸는 것도 원하는 대로 조절이 가능하며 try_lock이나 try_lock_for, try_lock_until 등도
지원합니다. 그리고 unique_lock끼리 소유한 뮤텍스
객체를 서로 교환도 할 수 있으며, 뮤텍스 객체를 얻거나 해제할 수도 있습니다.
간단한 경우에는 lock_guard가 사용하기 편하지만 뮤텍스를 다양하게 사용하고 싶은 경우에는 unique_lock이 훨씬 더 좋습니다.
unique_lock 생성
unique_lock
클래스의 생성자는 다양한 방법으로 뮤텍스를 사용할 수 있도록
여러 버전이 준비 되어 있습니다.
unique_lock()
noexcept;
unique_lock(unique_lock&&
Other) noexcept;
explicit
unique_lock(mutex_type& Mtx);
unique_lock(mutex_type&
Mtx, adopt_lock_t Adopt);
unique_lock(mutex_type&
Mtx, defer_lock_t Defer) noexcept;
unique_lock(mutex_type&
Mtx, try_to_lock_t Try);
template<class
Rep, class Period>
unique_lock(mutex_type& Mtx,
const chrono::duration<Rep, Period>
Rel_time);
template<class
Clock, class Duration>
unique_lock(mutex_type& Mtx,
const chrono::time_point<Clock,
Duration> Abs_time);
unique_lock(mutex_type&
Mtx,
const xtime *Abs_time) noexcept;
unique_lock의 사용 예는 아래와 같습니다.
std::mutex
m;
....
// 락을 만들고 동시에 뮤텍스의 소유권을 가진다
std::unique_lock
lck(m, std::adopt_lock);
std::mutex
m;
....
// 락을 만들지만 뮤텍스의 소유권은 가지지 않는다
std::unique_lock
lck(m,std::defer_lock);
...
if
(lck.try_lock()) {
....
}
std::unique_lock<std::timed_mutex>
lk(m,std::chrono::milliseconds(3));
....
if(lk)
{
process(data);
}
unique_lock 멤버 함수
- void
lock();
-
mutex_type *mutex() const _NOEXCEPT;
-
explicit operator bool() _NOEXCEPT
-
unique_lock& operator=(
unique_lock&& Other
) _NOEXCEPT;
- bool
owns_lock() const _NOEXCEPT;
-
mutex_type *release() _NOEXCEPT;
- void
swap(
unique_lock& Other
) _NOEXCEPT;
- bool
try_lock() _NOEXCEPT;
-
template<class Rep,
class Period>
bool try_lock_for(
const chrono::duration<Rep,
Period>& Rel_time
);
-
template<class Clock, class Duration>
bool
try_lock_until(const chrono::time_point<Clock, Duration>& Abs_time);
bool try_lock_until(const xtime *Abs_time);
- void
unlock();
댓글