2012-02-21 1 views
18

나는 잠금과 뮤텍스의 차이에 대해 매우 혼란 스럽다. 부스트 문서에서는 말한다"뮤텍스"와 "락"의 차이점은 무엇입니까?

잠금 유형

  • 클래스 템플릿 lock_guard
  • 클래스 템플릿 unique_lock
  • 클래스 템플릿 shared_lock
  • 클래스 템플릿 upgrade_lock
  • 클래스 템플릿 upgrade_to_unique_lock
  • 뮤텍스 관련 클래스 scoped_tr y_lock

뮤텍스 유형

  • 클래스 뮤텍스
  • 으로 typedef가 try_mutex
  • 클래스 timed_mutex
  • 클래스 recursive_mutex
  • 으로 typedef의 recursive_try_mutex
  • 클래스 recursive_timed_mutex
  • 은 다른 기사에서 클래스 shared_mutex

, 나는

boost::shared_mutex _access; 
void reader() 
{ 
    boost::shared_lock<boost::shared_mutex> lock(_access); 
    // do work here, without anyone having exclusive access 
}  
void conditional_writer() 
{ 
    boost::upgrade_lock<boost::shared_mutex> lock(_access); 
    // do work here, without anyone having exclusive access 

    if (something) { 
    boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock); 
    // do work here, but now you have exclusive access 
    } 
    // do more work here, without anyone having exclusive access 
} 

업데이트 질문, 다음과 같은 기능을 참조

  1. 사람이 "뮤텍스"와 "사이에 약간의 설명을 제공 할 수 자물쇠"?
  2. shared_mutex에 대해 shared_lock을 생성해야합니까? unique_lockshared_mutex으로 만들면 어떻게됩니까?
  3. 아니면이 뮤텍스에 대한 shared_lock를 작성하는 경우, 그것은 뮤텍스을 의미 하는가는 여러 스레드간에 공유 할 수 없습니다?
+0

내 기사 "뮤텍스는 어떻게 작동합니까?" 도움이됩니다 : http://mortoray.wordpress.com/2011/12/16/how-does-a-mutex-work-what-does-it-cost/ –

+1

새로운 질문입니다. 새로운 질문으로 그들에게 질문해야합니다. 이미 존재하는 질문에 후속 조치를 추가하지 마십시오. 또한 Boost의 문서에는이 모든 내용이 들어 있습니다. –

답변

30

뮤텍스은 동기화 개체입니다. 다른 스레드가 동일한 데이터에 동시에 액세스하지 못하도록하려면 코드 섹션의 시작 부분에서 뮤텍스에 대한 잠금을 획득하고 마지막에 잠금을 해제하십시오. 일반적으로 뮤텍스는 보호하는 데이터의 수명과 동일하며 하나의 뮤텍스에 여러 스레드가 액세스합니다.

잠금 개체은 해당 잠금을 캡슐화하는 개체입니다.객체가 생성되면 뮤텍스에 대한 잠금을 획득합니다. 파괴되면 잠금 장치가 해제됩니다. 일반적으로 공유 데이터에 액세스 할 때마다 새 잠금 객체를 만듭니다.

+2

+1 : 잠금 수명은 코드 섹션에 독점적으로 액세스하는 기간입니다. 뮤텍스의 수명은 일반적으로 잠길 수있는 코드 섹션의 존재를위한 것입니다. –

9

뮤텍스는 잠글 수있는 개체입니다. 잠금은 이 잠금을 유지하는 오브젝트입니다. 잠금을 만들려면 뮤텍스를 전달해야합니다.

1

잠금이 상호 배제를 제공하지만 synchronization.Unlike에게 세마포어를 컨디셔닝 할 수없는, 잠금은 소유자가, 소유는 잠금

예를의 행동에 중요한 역할을한다 -

class lockableObject { public void F() { 
mutex.lock(); ...; mutex.unlock(); 
} 
public void G() { 
mutex.lock(); ...; F(); ...; mutex.unlock(); 
} 
private mutexLock mutex; } 
// method G() calls method F() 

lockableObject 클래스의 Lock 뮤텍스는 메소드 F()와 G()를 중요한 섹션으로 전환하는 데 사용됩니다. 따라서 한 번에 하나의 스레드 만 lockableObject의 메서드 내에서 실행할 수 있습니다. 스레드가 메서드 G()를 호출하면 뮤텍스가 잠 깁니다. G() 메서드가 F() 메서드를 호출하면 F()에서 mutex.lock()이 실행되지만 이미 호출 한 스레드는 뮤텍스를 소유하고 있으므로 차단되지 않습니다. 뮤텍스가 잠금 대신 바이너리 세마포어 인 경우 F()에서 mutex.P()가 실행될 때 G()에서 F() 로의 호출이 호출 스레드를 차단합니다. (바이너리 세마포어에서 P()와 V() 연산의 결과는 교대해야 함을 상기하십시오.) F() 또는 G() 내부에서 다른 스레드를 실행할 수 없으므로 교착 상태가 발생합니다.

다음은 잠금과 이진 세마포어의 차이점입니다. 1 바이너리 세마포어의 경우 V()에 대한 중간 호출을하지 않고 P()를 두 번 호출하면 두 번째 호출이 차단됩니다. 그러나 잠금을 소유하고 소유권을 다시 요청하는 스레드는 차단되지 않습니다. 잠금이 항상 재귀 적이라는 사실에주의하십시오. 잠금을 사용하기 전에 문서를 확인하십시오. 2 lock() 및 unlock()에 대한 연속 호출 소유자는 동일한 스레드 여야합니다. 그러나 P()와 V()에 대한 연속 호출은 다른 스레드에 의해 수행 될 수 있습니다.

관련 문제