2014-01-14 2 views
2

나는 많은 수의 객체를 가지고 있는데, 각각 boost :: shared_mutex와 연관되어있다. (공유/고유 잠금 기능이 필요하다.)std :: lock()은 boost :: shared_mutex와 동일합니까?

코드에서 여러 개체의 고유 한 소유권을 한 번에 얻어야하는 경우가 있습니다.

for (FileMetaData* entry : smd->fileSet) { 
    entry->fileMutex.lock(); 
} 

// some critical work 

for (FileMetaData* entry : smd->fileSet) { 
    entry->fileMutex.unlock(); 
} 

다른 스레드가 서로 다른 잠금 세트를 얻으려고 시도 할 때 이런 결과가 발생하면 교착 상태가됩니다.

std :: lock()이 사용 사례에 적합하다는 것을 알게되었습니다. boost :: shared_mutex와 동등한가?

편집 : 정확히 내 경우 작동하지 않는 주문 잠금 패턴에 대해서는

:

T1 lock (C,D,E) 
T2 wants to lock (B,D), but can only obtain the lock for B 
T1 spawns T3 which works on (B,C), it stuck when obtaining the lock for B 

그래서 문제가 T1은 T3가 급부상 할 때 B에 별도의 잠금 장치가 필요한 것입니다, 이렇게하면 정렬 된 잠금 패턴이 깨집니다. 나는이 문제가 해결 될 수 있다고 생각한다. T2가 잠글 수 없을 때 T2가 B에 대한 잠금을 유지하지 않는다면, 본질적으로 std :: lock은 잠금이된다. Lockable가 작동합니다 아무것도 -

+0

: onstruct RAII 잠금 그래서 잠금 해제를 망치지 수 std::lock에 전달하는, 그래서 실제로 쓸 것 잠금을 시작합니다. 모든 기준을 사용하여 잠금을 정렬하고 순서대로 잠급니다. 모든 스레드가 동일한 잠금 순서를 존중하면 절대로 교착 상태가 될 수 없습니다. – Nemo

+0

@Nemo : 정렬 된 알고리즘을 비롯한 다양한 멀티 잠금 알고리즘의 성능 비교는 다음과 같습니다. http://howardhinnant.github.io/dining_philosophers.html –

답변

1

당신은 잠 무엇 당신의 통과에 따라 공유 소유권 잠금 독점뿐만 아니라 잠금을 수행 할 (통칭하여 "잠금 기능을"또는 동등 boost::lock) std::lock를 사용할 수 있습니다. 예를 들어,이 경우 두 std::mutex/boost::mutexA, B와 배타 모드로 boost::shared_mutex SM, 당신은 단순히 통과 잠 그려는 세 std::lock에 :

std::lock(A, B, SM); 

대신 공유 소유권 모드에서 SM을 수행 할 수 있습니다 잠 그려면 그것을 위해 잠금 해제 boost::shared_lock을 만들고 을 통과 잠금 기능으로 것을 : 질문과 관련이없는 메모에

boost::shared_lock<boost::shared_mutex> bsl{SM, boost::defer_lock}; 
std::lock(A, B, bsl); 

- 스타일의 선호 - 난 항상 C에 선호 당신이 전에 손에 전체 세트가 즉 - 당신이 한 번에 모든 필요한 락을 알고있는 경우

auto alk = boost::make_unique_lock(A, std::defer_lock); 
auto blk = boost::make_unique_lock(B, std::defer_lock); 
// boost::make_shared_lock(), where are you?!? 
boost::shared_lock<boost::shared_mutex> bsl{SM, boost::defer_lock}; 
std::lock(alk, blk, bsl); 
+0

감사합니다. 나는 한 가지 더 질문이있다. 필자의 샘플 코드에서는 각 뮤텍스가 FileSet에 상주하는 FileMetaData 구조체에 저장된다는 것을 알 수 있습니다. std :: lock에 대한 인수가되기 위해 어떻게 이러한 뮤텍스를 추출해야합니까? – Jeremy

+0

Casey가 게시 한 것 이외에 C++ 14에는 std :: shared_mutex 및 std :: shared_lock이 이미 포함되어 있습니다. 이는 boost와 거의 같습니다. Clang/Gcc는 이미이를 구현했습니다. – user534498

관련 문제