2012-07-07 2 views
4

리뷰가 필요한 기본 샘플이 있습니다 (C++).부스트가 동일한 스레드에 대해 다중 잠금을 얻습니다.

PublicFunc() 함수와 PrivateFunc()이라는 함수가 있다고 가정 해 보겠습니다. 나는 그들을 신중하게 동기화하고 싶다. 그러나 PrivateFunc은 PublicFunc을 호출 할 수도 있습니다. 이는 같은 스레드에서 호출하는 것을 의미합니다. 이로 인해 블록이 생기고이를 해결하고 싶습니다.

mutable boost::mutex m; 

void PublicFunc() { 
m.lock(); 
//Here it blocks, but why? 
//What I need is to get the lock if this func was called from PrivateFunc(), so exactly from the same thread. 
//But! It should definitely block on calling PublicFunc from outside while we are for example in the 'OtherPrivateFunc'. 

//Do some stuff 

//this is not necessary 
m.unlock(); 
} 

void PrivateFunc() { 
m.lock(); 

PublicFunc(); 

OtherPrivateFunc(); 

m.unlock(); 
} 

어떤 뮤텍스 또는 잠금이 부스트 라이브러리에서 올바른 것입니까? 감사합니다.

답변

4

mutex은 한 번만 잠글 수 있습니다. 뮤텍스를 잠그려고 시도하는 것이 뮤텍스에 대한 잠금을 보유하고있는 스레드에 의해 이루어진다 고하더라도, 잠긴 상태에서 뮤텍스를 잠그는 호출은 모두 차단됩니다.

같은 스레드에서 뮤텍스를 여러 번 잠글 수있게하려면 recursive_mutex을 사용하십시오.

또는 뮤텍스가 잠긴 것으로 가정하는 (개인) 멤버 함수 세트를 갖도록 코드를 재구성하고 다른 모든 함수가이 함수에 위임하도록하십시오. 이렇게하면 코드가 명확 해지고 동기화가 올바른지 쉽게 확인할 수 있습니다.

관련 문제