2012-10-11 2 views
0

필자가 이해하는 한, Windows에서는 CRITICAL_SECTION을 비 재귀 뮤텍스로만 사용할 수 있습니다. 재귀 뮤텍스를 얻으려면 OpenMutex와 친구들을 사용해야합니다.Windows에서 재귀 뮤텍스?

그러나 AFAIU, Win32에서 뮤텍스는 조건 변수와 함께 사용할 수 없습니다 (InitializeConditionVariable 등.)

Windows에서 조건 변수와 함께 재귀 뮤텍스를 사용하는 방법이 있나요?

+1

잘못 이해했습니다. 중대한 섹션 (뮤텍스까지) **은 재귀 적으로 사용될 수 있습니다 **. – valdo

답변

4

valdo 님의 의견이 적합합니다. CRITICAL_SECTION 재귀입니다. MSDN의 인용문은 다음과 같습니다. "스레드가 중요한 섹션의 소유권을 가지면 실행을 차단하지 않고 EnterCriticalSection 또는 TryEnterCriticalSection에 추가 호출을 할 수 있습니다." 문제 해결됨.

0

그건 의미가 없습니다. 의미 적으로, 조건 변수의 핵심은 대기 할 때 원자 적으로 잠금을 해제한다는 것입니다. 따라서 다른 스레드가 대기중인 작업을 수행하기 위해 잠금을 획득 할 수 있습니다. 그러나 재귀 뮤텍스의 "release"작업은 실제로 잠금을 해제하지 않을 수 있으므로 릴리스 이후에 대기하면 교착 상태가 발생할 수 있습니다. 이 작업을 수행하는 방법을 원한다는 사실은 설계 또는 조건 변수에 대한 이해에 문제가 있음을 강력하게 시사합니다.

생각해보십시오. 재귀 뮤텍스에서 잠금을 유지하는 함수가 두 번째 잠금을 획득 한 다음 절전 기능을 호출 할 때 어떤 일이 발생해야합니까? 잠금이 해제되면 객체가 잠겨있는 동안 객체가 수정되므로 첫 번째 함수의 논리가 깨집니다. 잠금이 해제되지 않으면 다른 스레드가 잠금을 유지해야하기 때문에 기다리는 것이 결코 일어날 수 없으므로 대기는 교착 상태가됩니다.

이미 조건 변수를 잠그고 있는지 여부를 모른 채 조건 변수를 사용하는 것은 현명한 방법이 아닙니다. 잠금 장치가 있는지 여부를 알면 재귀 잠금 기능이 필요하지 않습니다. 이미 자물쇠가 있다는 것을 알고 있으면 자물쇠 기능을 호출하지 마십시오. 자물쇠가 아직 없다는 것을 알고 있으면 자물쇠가 아니더라도 자물쇠 기능이 잘 작동합니다.

+0

내 사용 사례에서 뮤텍스에 대한 재귀 액세스는 대기가 완료된 후에 만 ​​발생합니다. 따라서 아무런 문제가 없습니다. –

+0

mutex를 재귀 적으로 사용할 때와 사용하지 않을 때를 추적하므로 재귀 적 뮤텍스가 필요하지 않습니다. 재귀 적으로 사용하는 경우 잠금/잠금 해제 함수 호출을 신경 쓰지 마십시오. –

+0

어딘가에 상태 (재귀 대 비 재귀)를 저장해야합니다. 이 스토리지 자체는 여러 스레드에 의한 동시 액세스에 내성이 있어야합니다. 그것은 원자학을 사용하는 것을 의미합니다. 너무 복잡합니다. 위에서 언급 한 것처럼 CRITICAL_SECTION *은 재귀 적이므로 아무런 문제가 없습니다. 어쨌든 도움에 감사드립니다! –