C ++ 14 std::mutex는 잠금 여부를 확인하는 메커니즘을 생략 한 것으로 보입니다 . 이 SO 질문을 참조하십시오 :
https://stackoverflow.com/questions/21892934/how-to-assert-if-a-stdmutex-is-locked
이를 해결하는 방법에는 여러 가지가 있습니다.
std::mutex::try_lock()
std::unique_lock::owns_lock()
그러나 이들 중 어느 것도 특히 만족스러운 해결책은 아닙니다.
try_lock()현재 스레드가 뮤텍스를 잠근 경우 거짓 음수를 반환하고 정의되지 않은 동작을 갖습니다. 또한 부작용이 있습니다. 원본 위에 owns_lock()건설이 필요합니다 .unique_lockstd::mutex
분명히 내 자신을 굴릴 수는 있지만 현재 인터페이스의 동기를 이해하고 싶습니다.
뮤텍스 (예 :)의 상태를 확인하는 기능 std::mutex::is_locked()은 난해한 요청처럼 보이지 않으므로 표준위원회가이 기능을 감독하는 것이 아니라 의도적으로 생략 한 것 같습니다.
왜?
편집 : 좋아, 아마도이 유스 케이스는 내가 예상했던 것처럼 일반적이지 않으므로 특정 시나리오를 설명 할 것입니다. 여러 스레드에 배포되는 기계 학습 알고리즘이 있습니다. 각 스레드는 비동기 적으로 작동하며 최적화 문제가 완료되면 마스터 풀로 돌아갑니다.
그런 다음 마스터 뮤텍스를 잠급니다. 그런 다음 스레드는 자손을 돌연변이시킬 새 부모를 선택해야하지만 현재 다른 스레드에 의해 최적화되는 자손이없는 부모에서만 선택할 수 있습니다. 따라서 현재 다른 스레드에 의해 잠겨 있지 않은 부모를 찾으려면 검색을 수행해야합니다. 마스터 스레드 뮤텍스가 잠겨 있기 때문에 검색 중에 뮤텍스 상태가 변경 될 위험이 없습니다. 분명히 다른 솔루션 (현재 부울 플래그를 사용하고 있음)이 있지만 뮤텍스가 스레드 간 동기화를 위해 존재하기 때문에이 문제에 대한 논리적 솔루션을 제공한다고 생각했습니다.
is_locked시겠습니까?