2011-02-17 3 views
4

스레드가 뮤텍스를 끝내기 전에 뮤텍스에서 CloseHandle을 호출하여 ReleaseMutex를 아직 호출하지 않은 경우 예상되는 동작은 무엇입니까?Mutex에서 CloseHandle, ReleaseMutex 전에 - 어떻게됩니까?

+0

그런 일을하는 이유는 무엇입니까? –

+0

@San Jacinto : MTA COM 개체에는 작업을 수행하고 CoFreeUnusedLibraries (0, 0)를 호출하는 호출자가 지연을 0으로 수행하는 스레드가 있습니다.이 호출자는 DllCanUnloadNow를 호출하여 S_OK를 반환하지만 뮤텍스는 ' t 출시되었습니다. MTA에 대한 지연은 기본적으로 스레드가 완료 될 수 있도록 10 분이지만,이 경우 NULL이 될 수 있도록 뮤텍스를 확인해야하며, 그렇지 않으면 DllCanUnloadNow에서 S_FALSE를 반환해야합니다. 그러면 메모리 액세스 위반이 발생합니다. 이제 mutex가 == NULL이 될 때까지 기다리는 문제는 Explicit가 CloseHandle을 호출 한 적이 없다는 것입니다. –

+0

와우, 멋진 설명. 추후 사용자를 위해이 정보를 포함하도록 질문을 편집 하시겠습니까? –

답변

9

가장 심각한 결과는 뮤텍스가 차단 해제되기를 기다리는 스레드입니다. WaitXxx 호출은 WAIT_ABANDONED를 반환합니다. 어느 시점에서 TerminateProcess를 호출하는 것은 정말 좋은 생각입니다. 왜냐하면 방금 무슨 일이 일어 났는지 전혀 알지 못하기 때문입니다.

+0

'WAIT_ABANDONED'는 뮤텍스 잠금을 소유하고있는 동안 스레드가 종료 될 경우에만보고됩니다. 이것은 뮤텍스 핸들에서 조기에 호출 된 CloseHandle()과는 다릅니다. –

+0

@Remy - 당신이 ReleaseMutex() 호출에 대해 얻은 GetLastError() 값을 혼란에 빠뜨리고 있다고 생각합니다. 저는 WaitForSingleObject()와 친구들에 대해서 이야기하고 있습니다. –

+0

CloseHandle을 호출하기 전에 스레드가 완료되었는지 확인하기 위해 WaitForSingleObject가 좋지 않다고 생각하십니까? –

11

CloseHandle()은 전달 된 핸들을 즉시 파괴합니다. 닫힌 뮤텍스 핸들과 함께 호출하면 ReleaseMutex()ERROR_INVALID_HANDLE 오류 코드와 함께 실패합니다.

뮤텍스의 이름이 지정되면 뮤텍스를 뒷받침하는 하나의 참조 카운트 된 커널 개체가 있지만 CreateMutex()OpenMutex()은 개별적으로 닫아야하는 고유 한 HANDLE 값을 반환합니다. 동일한 명명 된 뮤텍스에 대한 여러 핸들이 만들어 지거나 열리는 경우 한 핸들에서 CloseHandle()을 호출해도 다른 핸들이 같은 뮤텍스에 적용되지 않습니다.

1

이 경우 CloseHandle()은 핸들을 파괴하지만 모든 핸들이 닫힌 경우에만 뮤텍스 개체가 메모리에서 제거됩니다. 그래서 CloseHandle (핸들)에 의해 핸들을 파괴 할 것이므로 ReleaseMutex (핸들)는 작동하지 않습니다. 그러나 뮤텍스는 계속해서 그 스레드가 소유 할 수 없기 때문에 뮤텍스 잠금을 기다리는 다른 스레드에 영향을 미칩니다.

관련 문제