2013-10-31 1 views
0

나는 lock_guard와 unique_lock의 차이점을 읽고 있었고 unique_lock은 lock_guard의 향상된 버전이라는 것을 알게되었습니다. 그런 독특한 잠금 장치로 잠금 장치는 항상 지연 될 수 있습니다. 나는 this 문서를 읽었으며 boost :: lock을 보았습니다. 이 방법을 어떻게 사용할 수 있는지 알고 싶었습니다. 나는 시도 다음잠금 및`boost :: lock`

boost::mutex mutx; 
boost::unique_lock<boost::mutex> guard (mutx,boost::defer_lock); 
boost::lock(guard); //too few arguments in function call. 

사람이 무엇을 부스트 :: 잠금 나에게 설명 할 수 있다면 나는 그것을 감사하겠습니다하고

답변

0

boost::lock의 목적은 교착 상태가 발생하지 않도록 여러 개의 잠금을 잠그는 것입니다.

이 경우 고려 : 모두 잠금 장치가 잠겨되고 스레드하지 않는 한 아무 것도 실행되지 않습니다 : 첫 번째 스레드가 a 잠금 장치를 잠그고 다음 두 번째 스레드가 b 자물쇠를 잠그는 경우 지금

unique_lock<...> a, b; 

// thread 1 
a.lock(); 
b.lock(); 
... 

// thread 2 
b.lock(); 
a.lock(); 

을, 당신은 문제가 그 중 하나가 잠금을 해제합니다. 이는 불가능합니다. 이 조건을 교착 상태라고합니다.

boost::lock은 잠긴 잠금을 만났을 때 이미 잠긴 모든 잠금을 잠금 해제하여이 문제를 방지합니다. 두 가지 잠금 사례에 대한 구현은 다음과 유사 할 수 있습니다.

template<class L1, class L2> 
void lock(L1& l1, L2& l2) 
{ 
    while (1) { 
     if (l1.try_lock()) { 
      if (l2.try_lock()) { 
       return; 
      } else { 
       l1.unlock(); 
      } 
     } 
     // yield (execute another thread) here 
    } 
} 
0

당신이

mutex mutx 
unique_lock<mutex> guard(mutx,defer_lock); 
guard.lock(); 

을하셨습니까 works.Thanks 방법?

일단 lock_guard 또는 unique_lock이 있으면 뮤텍스를 직접 사용하는 것을 중단하고 가젯 개체를 사용하게됩니다.

+0

내 코드가 수정되었습니다. 그 부분을 이해합니다. 그러나 나는 boost :: lock이하는 일과 사용 방법을 알고 싶었다. – Rajeshwar

+0

[docs를 읽으려고 했는가?] (http://www.boost.org/doc/libs/1_54_0/doc/html/thread/) synchronization.html # thread.synchronization.lock_functions)? 거기에 말하자면, 교착 상태를 피하면서 여러 객체를 잠급니다. 더 많은 통일성을 제공 할 수는 있지만 단일 인수로 호출하는 것이 타당하지 않습니다. 도대체, 그것은 심지어 제로 논쟁을지지 할 수 있고 아무 것도하지 않을 수 있습니다. 그러나 그것이 어떻게 설계되었는지는 아닙니다. – DanielKO