Что означает код NTSTATUS 0xC0000046 (STATUS_MUTANT_NOT_OWNED)?

 
Предыдущий Следующий
STATUS_INVALID_PAGE_PROTECTION STATUS_SEMAPHORE_LIMIT_EXCEEDED

STATUS_MUTANT_NOT_OWNED

Освободить этот мутант может только владеющий поток

Мутанты ядра и мьютексы Win32 являются объектами синхронизации с владельцем. Владение назначается потоку, успешно захватившему объект, а освобождение связано с этим владельцем. Этот статус означает, что путь освобождения выполнялся в другом потоке или после того, как владение уже было снято.

Сохраните идентификаторы потока захвата и потока освобождения, а также глубину рекурсии. Передача работы между потоками пула часто указывает на архитектурную ошибку: код, захватывающий мьютекс в одной callback-функции и ставящий освобождение в очередь другой callback-функции, нарушает модель владения, даже если защищаемые данные являются глобальными. Замена мьютекса семафором только ради межпоточного освобождения меняет семантику синхронизации и должна быть осознанным архитектурным решением.

Что проверить

  • Отследите каждое успешное ожидание, захватывающее мутант, и каждое освобождение.
  • Сравните идентификатор потока-владельца и счётчик рекурсии в момент ошибки.
  • Выполняйте захват и освобождение в одном логическом потоке либо выберите примитив синхронизации без владельца.

Ссылки


Нужно найти другой код? Найти другой код состояния или ошибки.