아래에 표시된 것과 같은 작업을하고 싶지만 상태를 변경하지 않고 뮤텍스를 쿼리하는 방법이없는 것 같습니다. 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
}
}
[std :: mutex :: try_lock] (http://www.cplusplus.com/reference/mutex/mutex/try_lock/)을 사용할 수 있습니다. – Jarod42
. . . 그러나 그것은 mutex의 상태를 변경합니다. – learnvst
@learnvst하지만 뮤텍스가 잠겨 있지 않은 경우에만 코드가 상태를 변경합니다. – Angew