CloseHandle на Mutex, до выпуска ReleaseMutex - что происходит? - PullRequest
4 голосов
/ 17 февраля 2011

Если я вызову CloseHandle для мьютекса до того, как поток завершит работу с мьютексом и, следовательно, еще не вызвал ReleaseMutex, каково ожидаемое поведение?

Ответы [ 3 ]

11 голосов
/ 17 февраля 2011

CloseHandle() немедленно уничтожает переданный ему дескриптор.ReleaseMutex() затем завершится ошибкой с кодом ошибки ERROR_INVALID_HANDLE при вызове с закрытым дескриптором мьютекса.

Если мьютекс назван, существует один объект ядра с подсчетом ссылок, поддерживающий мьютекс, но CreateMutex()и OpenMutex() возвращает уникальные HANDLE значения, которые должны быть закрыты по отдельности.Если несколько дескрипторов для одного и того же именованного мьютекса созданы / открыты, вызов CloseHandle() для одного дескриптора не влияет на другие дескрипторы для одного и того же мьютекса.

10 голосов
/ 18 февраля 2011

Самое серьезное последствие - поток, ожидающий разблокировки мьютекса. Вызов WaitXxx возвращает WAIT_ABANDONED. В этот момент было бы неплохо вызвать TerminateProcess, потому что вы не представляете, что, черт возьми, произошло.

3 голосов
/ 31 марта 2015

CloseHandle () в этом случае уничтожает дескриптор, но объект мьютекса удаляется из памяти только тогда, когда все его дескрипторы были закрыты. Таким образом, с помощью CloseHandle (дескриптор) вы уничтожите этот дескриптор, и поэтому ReleaseMutex (дескриптор) не будет работать. Но мьютекс по-прежнему будет принадлежать этому потоку, и он не сможет его освободить, что повлияет на другие потоки, ожидающие блокировки мьютекса.

...