2014-04-15 2 views
4

아래에 표시된 것과 같은 작업을하고 싶지만 상태를 변경하지 않고 뮤텍스를 쿼리하는 방법이없는 것 같습니다. someFunctionCalledRepeatedlyFromAnotherThread()은 잠긴 뮤텍스가 해제 될 때까지 기다리는 것을 원하지 않습니다. 대체 조치를 수행 한 직후에 복귀해야합니다. 이 누락이 안전을 위해 존재하는 것으로 추측하고 있습니다. 잠금을 쿼리하여 함수를 반환하는 사이에 잠금이 해제 될 수 있기 때문입니다. 내 경우에는 doSomeAlternativeAction()이 발생하는 동안 잠금이 해제되면 나쁜 일은 발생하지 않습니다. 내가이 상황에 처해 있다는 사실은 내가 틀린 일을하고 있다는 것을 의미 할 것입니다. 그래서 어떻게 디자인을 바꾸어야합니까? 상태에 대한대기 상태에 대한 std :: mutex 쿼리

class MyClass 
{ 
    std::mutex initMutex; 
public: 
    void someInitializationFunction() 
    { 
     std::lock_guard<std::mutex> lock(initMutex); 
     // Do some work 
    } 

    void someFunctionCalledRepeatedlyFromAnotherThread() 
    { 
     if (initMutex.isLocked()) 
     { 
      doSomeAlternativeAction(); 
      return; 
     } 
     // otherwise . . . 
     std::lock_guard<std::mutex> lock(initMutex); 
     // carry on with work as usual 
    } 
} 
+2

[std :: mutex :: try_lock] (http://www.cplusplus.com/reference/mutex/mutex/try_lock/)을 사용할 수 있습니다. – Jarod42

+0

. . . 그러나 그것은 mutex의 상태를 변경합니다. – learnvst

+0

@learnvst하지만 뮤텍스가 잠겨 있지 않은 경우에만 코드가 상태를 변경합니다. – Angew

답변

9

요구 뮤텍스는 쓸모가 : 지금의 잠금을 해제 할 수 있지만, 시간에 당신이 그것을 잠글 주위에 얻을, 그것은 고정 할 수있다. 그래서 그런 방법이 없습니다.

그것은, 그러나,이 잠겨 있지 않은 경우를 고정하고 그렇지 않으면 잠금 및 false을 구입 한 경우 true을 반환하는 방법 try_lock()을 가지고있다. std::unique_lock (고급 버전 std::lock_guard)에는 전화 할 수있는 옵션이 있습니다.

그래서 당신은 할 수 있습니다 :

void someFunctionCalledRepeatedlyFromAnotherThread() 
{ 
    std::unique_lock<std::mutex> lock(initMutex, std::try_to_lock); 
    if(!lock.owns_lock()) 
    { 
     doSomeAlternativeAction(); 
     return; 
    } 
    // otherwise ... go ahead, you have the lock 
} 
0

는 소리는 표준 : unique_lock 대신 표준 : lock_guard를 사용할처럼. try_lock 메서드는 TryEnterCriticalSection과 비슷하게 작동합니다. 즉, 함수가 원자 적으로 잠금을 획득하고 가능한 경우 'true'를 반환하거나 잠금을 얻을 수 없으면 차단을하지 않고 'false'를 반환합니다. http://msdn.microsoft.com/en-us/library/hh921439.aspxhttp://en.cppreference.com/w/cpp/thread/unique_lock/try_lock을 참조하십시오. unique_lock에는 try_lock_for 및 try_lock_until과 같은 잠금 시도에 사용할 수있는 다른 멤버가 있습니다.

관련 문제