2016-07-25 1 views
1

스레드에서 lock_guard 사용하는 다음과 같은 제어 흐름이 : 네 do 부품이 모두 다른 일을 실행하는 방법방법이 조건

mutex.lock() 
if (condition) { 
    // do synced things 
    mutex.unlock(); 
    // do parallel things 
} else { 
    // do other synced things 
    mutex.unlock(); 
    // do other parallel things 
} 

참고.

대신 std::lock_guard을 사용하여 잠금 및 잠금 해제를위한 직접 호출을 바꿉니 까? 두 경우에 병렬 물건이 글로벌 상태를 지키고 뮤텍스를 해제 한 후 수행하기 때문에

+0

뮤텍스 잠금의 범위에 있어야합니까? – NathanOliver

+0

@ NathanOliver 예, 액세스 할 때 잠 가야합니다. –

+1

개인적으로'unique_lock'을 사용하고 수동으로 뮤텍스를 잠금 해제합니다. 잠금 해제 프로세스에 대한 RAII와 제어 권한을 얻게됩니다. – KABoissonneault

답변

5

std::unique_lock 당신이 찾고있는 것처럼 보입니다. 의미는 std::lock_guard과 유사하지만 allows more sophisticated constructs입니다. 따라서 귀하는 여전히 예외 안전을 얻지 만 명시 적으로 초기 잠금을 해제 할 수 있습니다. 뭔가 같은 :

std::unique_lock<decltype(mutex)> guard(mutex); // calls mutex.lock() like lock_guard 
if (condition) { 
    // do synced things 
    guard.unlock(); 
    // do parallel things 
} else { 
    // do other synced things 
    guard.unlock(); 
    // do other parallel things 
} 
// unlocks on leaving scope, if held similar to lock_guard 
1
bool cond; 
{ 
    std::lock_guard<std::mutex> lg(mutex); 
    cond = global_condition; 
    if (cond){ 
     // do some synced stuff 
    } else { 
     // do the other synced stuff 
    } 
} 

if (cond){ 
    // do parallel stuff 
} else { 
    // do the other parallel stuff 
} 

, 그것은 조건이 변경되지 수 있습니다, 또는 그것을 변경하는 경우 우리는 상관하지 않는 것을 의미한다. 따라서 저장된 값을 기반으로 값과 if-else를 나중에 다시 저장할 수 있습니다.