2014-06-16 10 views
0

(뮤텍스, 기간) :mutex.timed_lock (기간)의 차이와 부스트 : timed_mutex :: scoped_lock scoped_lock 나는 사이의 차이 인 알고 싶습니다

boost::timed_mutex _mutex; 
if(_mutex.timed_lock(boost::get_system_time() + boost::posix_time::milliseconds(10))){ 
    exclusive code 
    _mutex.unlock(); 
} 

boost::timed_mutex _mutex; 
boost::timed_mutex::scoped_lock scoped_lock(_mutex, boost::get_system_time() + boost::posix_time::milliseconds(10)); 
if(scoped_lock.owns_lock()) { 
    exclusive code 
} 

scoped_lock은 unlock 할 호출을 불필요하게 만든다.

  1. 왜 첫 번째 경우에 우리는 뮤텍스의 멤버 함수로 timed_lock를 호출하고 두 번째에 우리가 뮤텍스의 잠금과 기간을 구성 : 내 질문에 의미합니다.
  2. 어느 것이 더 효율적입니까?
  3. boost :: posix_time의 사용법은 정상이며 다른 종류 인 을 사용하는 것이 좋습니다. 크로노 또는 듀레이션?
  4. 위의 두 가지 방법보다 'x'시간 동안 잠금을 얻으려고하면 더 빠른 방법이 더 빠릅니까?
+0

scoped_lock은 shared_ptr이 원시 포인터와 같은 timed_mutex를 사용합니다. 범위를 벗어나면 mutex 잠금이 해제됩니다. 단순한 timed_mutex (아마도 매우 얇지 만 별도의 관리 레이어를 추가하는 것)보다 많은 오버 헤드가있을 수 있지만 몇 가지 이점이 있습니다. 독점 코드에 예외가있는 것처럼 뮤텍스는 잠금 해제됩니다. 이것은 timed_mutex에서만 발생합니다. – andrjas

+0

불량한 답변은 아니지만 불필요한 잠금 해제에 대해 이미 알고 있다고 말했기 때문에 간신히 네 가지 질문 중 하나에 대답합니다. 잠금 해제를 처리하는 경우 오버 헤드가 조금 더 필요합니다. 나는 의미심장하려고 노력하지 않고있다. 그러나이 대답은 나를 위해 물건을 깨끗하게하지 않는다. 어쨌든 고마워 :) –

답변

1

나는 당신의 질문에 대답하려고합니다 :이 Document 읽을 수있는, 잠금 뮤텍스의 잠금 상태에 대한 RAII 장치로

  1. 사용된다. 즉, 잠금은 자신이 참조하는 뮤텍스를 소유하지 않습니다. 그들은 단지 뮤텍스에 대한 자물쇠를 소유하고 있습니다. 기본적으로 그것이 의미하는 것은 뮤텍스 잠금을 초기화 할 때 뮤텍스 잠금을 획득하고 잠금 객체가 파괴 될 때 잠금을 해제한다는 것입니다.
    두 번째 예제에서 mutex에서 timed_lock을 호출 할 필요가 없었던 이유는 scoped_lock이 초기화 할 때 scoped_lock을 사용하기 때문입니다.
  2. 첫 번째 예제가 더 효율적인지는 모르겠지만 두 번째 예제 (RAII scoped_lock)가 훨씬 안전하다는 것을 알고 있습니다. 뮤텍스를 잠금 해제하는 것을 잊지 않고 더 중요한 것은, 코드를 사용하고 수정하는 다른 사람들이 뮤텍스 관련 문제를 일으키지 않도록 보장합니다.
  3. as posix_time에서 scoped_lock (기본적으로 unique_lock<timed_mutex>)을 생성 할 수 없다는 것을 알고있는 한. 나는 개인적으로 기간을 선호한다.
  4. Duration 절대 시간으로 자물쇠를 만드는 것은 최선의 선택입니다.