Что произойдет, если мы насильно убить запущенную нитьУбить выполняемый поток
У меня есть поток, а именно RecordThread()
, который вызывает некоторую сложную и отнимает много времени функции. В этих функциях я использую примерку уловы блоков, выделение и открепление память и использование критических секции переменных и т.д.
как
void RecordThread()
{
AddRecord();
FindRecord();
DeleteRecord();
// ...
ExitThread(0);
}
После создания этой темы, я сразу же убить его до завершения нити его исполнение. В этом случае, что происходит, если поток принудительно убит? Выполняют ли внутренние функции (AddRecord
, DeleteRecord
) их выполнение после того, как мы убили нить?
Чтобы сделать его более явным: 'TerminateThread' может убить ваш поток в середине инструкции' i ++'. Он не пытается искать «хорошие» точки, такие как вызовы функций. – MSalters
Обратите внимание, что POSIX сильно отличается от API Win32 в этом отношении (по умолчанию, если поток не изменил настройки его отмены), он действительно только убьет ваш поток в точке отмены. Поэтому, не считаясь с опасностью, он не так опасен везде и, следовательно, не «переносится» :-) – Damon
Если это не очевидно из других комментариев, еще несколько причин, почему вы никогда не должны использовать TerminateThread: [Windows начала собирать действительно большие куски мусора TerminateThread на тротуаре, но он все еще мусор на тротуаре] (http://blogs.msdn.com/b/oldnewthing/archive/2015/08/14/10635157.aspx) –