검색결과 리스트
unique_lock에 해당되는 글 1건
- 2013.07.15 [ VC11-C++11 ] 병렬 프로그래밍. unique_lock
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();
댓글