В этом случае приложение выйдет из строя:
- Приложение имеет два потока.
- Поток 1 вызывает EnterCriticalSection с объектом m_CS
- Поток 2 затем пытается для входа в тот же критический раздел
- Поток 1 завершает поток 2 с помощью TerminateThread
- Поток 1 вызывает LeaveCriticalSection
В Windows 10, когда поток 1 покидает критический раздел, происходит сбой приложения с нарушением прав доступа. Это происходит только тогда, когда другой поток был завершен во время ожидания EnterCriticalThread.
Если посмотреть на трассировку стека, то это выглядит так (последний кадр вверху):
Код: Выделить всё
RtlpWakeByAddress
RtlpUnWaitCriticalSection
RtlLeaveCriticalSection
В Интернете я не нашел ни ответа на этот вопрос, ни утверждения, что изменилось в Windows 10. Только ветка на Reddit и около 1800 отчетов о сбоях для Mozilla Firefox с тем же стеком вызовов за последний месяц. Я связался с автором сообщения на Reddit, и он пока не смог это исправить.
Итак, кто-нибудь сталкивался с этой проблемой и, возможно, у него есть решение или совет. ? В качестве решения сейчас я вижу только переосмысление использования WinAPI TerminateThread и старание избегать его, насколько это возможно. Вероятно, это еще один способ провести рефакторинг кода и подумать об архитектуре приложения.
Любой ответ приветствуется.
Заранее спасибо
Подробнее здесь: https://stackoverflow.com/questions/396 ... calsection
Мобильная версия