Хороший вопрос.
Есть несколько подходов к этому.
Первый подход - это то, что я считаю идеальным подходом.И это никогда не заканчивать темы.Причин для этого много, но вот несколько важных моментов:
- Если ваш поток владеет объектом синхронизации, он не будет освобожден
- У объектов RAII нет шансовочистить
- Выделенная память не будет освобождена
- Если вы находитесь в середине вызовов ядра Certian, вы можете использовать все ваше приложение
Итакпри таком подходе вы должны определить причины, по которым потоки не закрываются, и устранить эту проблему.Вы можете обнаружить, что проблемы уходят глубоко.Вы можете обнаружить тупики, условия гонки и т. Д. Статический анализ может помочь найти эти проблемы.
Идеальный подход - это тот, который вы всегда должны придерживаться.И при этом лучше не использовать спиновый замок.Вместо этого Wait () на дескрипторе потока с таймаутом.Вращаясь, вы тратите впустую ресурсы и крадете временные срезы из потока, который вы ждете.
Но в реальном мире, в производственном коде, вам нужна запасная мера на случай, если все остальное даст сбой.Сначала вы должны попробовать несколько методов, чтобы вызвать отключение потока.Если все не получается в крайнем случае, убить поток.Но из-за опасностей, связанных с убийством зомби, после того, как вы это сделаете, вам следует перезапустить все приложение.Когда вы уничтожаете поток, вы можете перевести процесс в недетерминированное состояние.Так что начните сначала.Зарегистрируйте сообщение об ошибке, закройте приложение и запустите снова.