POSIX를 사용하면 뮤텍스를 재귀 적으로 사용할 수 있습니다. 즉, 동일한 스레드가 동일한 뮤텍스를 두 번 잠글 수 있으며 교착 상태가 발생하지 않습니다. 물론 두 번 잠금을 해제해야합니다. 그렇지 않으면 다른 스레드가 뮤텍스를 얻을 수 없습니다. pthread를 지원하는 모든 시스템이 재귀 뮤텍스도 지원하지는 않지만 POSIX를 준수 하려면을 준수해야합니다 .
다른 API (더 높은 수준의 API)도 일반적으로 잠금이라고하는 뮤텍스를 제공합니다. 일부 시스템 / 언어 (예 : Cocoa Objective-C)는 재귀 및 비 재귀 뮤텍스를 모두 제공합니다. 일부 언어는 하나 또는 다른 언어 만 제공합니다. 예를 들어 Java 뮤텍스는 항상 재귀 적입니다 (같은 스레드가 같은 객체에서 두 번 "동기화"할 수 있음) 그들이 제공하는 다른 스레드 기능에 따라 재귀 뮤텍스가없는 것은 쉽게 직접 작성할 수 있기 때문에 아무런 문제가 없을 수 있습니다 (이미 더 간단한 뮤텍스 / 조건 작업을 기반으로 재귀 뮤텍스를 이미 구현했습니다).
내가 정말로 이해하지 못하는 것 : 비 재귀 뮤텍스는 무엇인가? 동일한 뮤텍스를 두 번 잠그면 스레드 교착 상태가 발생하는 이유는 무엇입니까? 이를 피할 수있는 고급 언어조차도 (예를 들어 교착 상태가되는지 테스트하고 예외가 발생하면 예외를 던지는 경우) 일반적으로 그렇게하지 않습니다. 대신 스레드 교착 상태가 발생합니다.
실수로 두 번 잠그고 한 번만 잠금을 해제하고 재귀 뮤텍스의 경우 문제를 찾기가 더 어려워서 대신 잘못된 잠금이 나타나는 위치를 즉시 교착 상태에 빠뜨릴 수 있습니까? 그러나 잠금을 해제 할 때와 마지막 잠금을 해제하고 카운터가 0이 아닌 상황에서 잠금 카운터를 반환하는 것과 같은 작업을 수행 할 수 없었습니다. 예외를 던지거나 문제를 기록 할 수 있습니까? 아니면 내가 볼 수없는 비 재귀 뮤텍스의 다른 유용한 유스 케이스가 있습니까? 비 재귀 뮤텍스가 재귀 뮤텍스보다 약간 빠를 수 있기 때문에 성능일까요? 그러나 나는 이것을 테스트했고 그 차이는 실제로 그렇게 크지 않습니다.