programing

boost :: unique_lock 대 boost :: lock_guard

nasanasas 2020. 12. 11. 08:17
반응형

boost :: unique_lock 대 boost :: lock_guard


이 두 잠금 클래스의 차이점을 잘 이해하지 못합니다. 부스트 문서에서는 boost::unique_lock자동으로 잠금을 실현하지 않는다고합니다.

이 사이의 주요 차이점 것을 뜻 unique_lock하고이 lock_guard와 있다는 것입니다 unique_lock우리가 명시 적으로 호출해야합니다 lock()기능?


먼저 질문에 답하십시오. 아니요, unique_lock에서 lock을 호출 할 필요가 없습니다. 아래 참조 :

unique_lock은 더 많은 기능을 가진 유일한 잠금 클래스입니다. 대부분의 경우 lock_guard는 원하는 작업을 수행하고 충분합니다.
unique_lock은 더 많은 기능을 제공합니다. 예를 들어 시간 초과가 필요하거나 객체 생성 이후의 시점으로 잠금을 연기하려는 경우 시간 제한 대기. 그래서 그것은 당신이하고 싶은 일에 크게 좌우됩니다. BTW : 다음 코드 스 니펫은 동일한 작업을 수행합니다.

boost::mutex mutex;
boost::lock_guard<boost::mutex> lock(mutex);

boost::mutex mutex;
boost::unique_lock<boost::mutex> lock(mutex);

첫 번째는 데이터에 대한 액세스를 동기화하는 데 사용할 수 있지만 조건 변수를 사용하려면 두 번째 변수로 이동해야합니다.


현재 가장 많이 득표 한 답변은 좋지만 조금 더 깊이 파헤쳐 서 같은 배에있을 수있는 사람들과 공유하기로 결정하기 전까지는 내 의심을 명확히 해주지 못했습니다.

첫째로 모두 lock_guardunique_lockRAII 패턴을 다음, 간단한 사용 사례에 잠금이 건설 중에 획득 자동으로 파괴하는 동안 잠금 해제. 즉, 사용 사례의 경우, 당신의 여분의 유연성을 필요로하지 않습니다 unique_locklock_guard더 효율적입니다.

두 가지의 주요 차이점은 unique_lock인스턴스가 연결된 뮤텍스를 항상 소유 할 필요가없는 반면 인스턴스는 뮤텍스를 lock_guard소유하고 있다는 것입니다. unique_lock, 잠금을 소유하고 있는지 여부를 나타내는 추가 플래그와이를 확인하기위한 다른 추가 메서드 'owns_lock ()'이 필요합니다. 이를 알면이 플래그가 설정 및 검사 할 추가 데이터의 오버 헤드와 함께 가져 오는 모든 추가 이점을 설명 할 수 있습니다.

  1. 잠금은 건설에서 바로 잡을 필요가 없으며 건설 std::defer_lock중에 뮤텍스를 잠금 해제 상태로 유지하기 위해 플래그를 전달할 수 있습니다 .
  2. 함수가 끝나기 전에 잠금을 해제 할 수 있으며 소멸자가 해제 할 때까지 기다릴 필요가 없으므로 편리합니다.
  3. 함수에서 잠금 소유권을 전달할 수 있으며, 이동 가능 하며 복사 불가능 합니다.
  4. 조건을 기다리는 동안 뮤텍스를 잠그고, 조건을 확인하고, 잠금을 해제해야하므로 조건부 변수와 함께 사용할 수 있습니다.

그들의 구현은 경로 ... / boost / thread / locks.hpp 아래에서 찾을 수 있습니다-그리고 그들은 다른 하나 옆에 앉아 있습니다 :) 요약하자면 :

lock_guard 는 생성자에서 뮤텍스를 잠그고 세부 사항에 신경 쓰지 않고 소멸자에서 잠금을 해제하는 간단한 간단한 유틸리티 클래스입니다.

unique_lock 은 약간 더 복잡한 기능으로 꽤 많은 기능을 추가하지만 생성자에서 여전히 자동으로 잠 깁니다. "잠금 소유권"개념을 도입했기 때문에 unique_lock이라고합니다 (owns_lock () 메서드 참조).


당신이 익숙하다면 pthreads(3):

  • boost::mutex = pthread_mutex_*
  • boost::unique_lock= pthread_rwlock_*기록 / 배타적 로크를 얻기 위해 (즉, 사용 pthread_rwlock_wrlock)
  • boost::shared_lock= pthread_rwlock_*판독 / 공유 잠금을 획득하기 위해 (즉, 사용 pthread_rwlock_rdlock)

예 a boost::unique_lockboost::mutex비슷한 방식 함수이지만 boost::mutex일반적으로 a는 획득하고 해제하는 더 가벼운 뮤텍스입니다. 즉, shared_lock잠금을 이미 획득 한은 더 빠르지 만 (동시성을 허용 함) unique_lock.

구현 세부 정보를 보려면 내부를 살펴 봐야하지만 이것이 의도 된 차이점의 요점입니다.


성능에 대해 말하면 다음은 대기 시간에 대한 적당히 유용한 비교입니다.

http://www.eecs.berkeley.edu/%7Ercs/research/interactive_latency.html

내가 / 누군가 다른 pthread_ * 프리미티브의 상대적 비용을 벤치마킹 할 수 있다면 좋을 것입니다. 그러나 마지막으로 살펴본 결과 pthread_mutex_*는 ~ 25us 였지만 pthread_rwlock_*읽기 잠금이 이미 획득되었는지 여부에 따라 ~ 20-100us였습니다 (~ 10us ) 또는 아닙니다 (~ 20us) 또는 writer (~ 100us). 현재 수치를 확인하려면 벤치마킹해야하며 OS별로 매우 다릅니다.


고유 잠금과 공유 잠금의 차이점을 강조해야 할 때 unique_lock을 사용할 수도 있다고 생각합니다.

참고 URL : https://stackoverflow.com/questions/6731027/boostunique-lock-vs-boostlock-guard

반응형