Что такое безопасный способ остановить поток?

У меня есть поток, который содержит выполнение IronPython script. По какой-то причине мне может понадобиться остановить этот поток в любое время, включая script выполнение. Как достичь этого? Первая идея Thread.Abort(), но она известна как зло...

Ответ 1

Ну и у вас вопрос и последующие комментарии я могу предложить вам два варианта, с некоторыми дополнительными "предупреждениями":

  • Если ваша нить выполняет что-то на каждой итерации, вы можете установить волатированный логический флаг таким образом, чтобы он выходил после завершения текущей итерации (псевдокод, потому что я не знаком с python):

    while shouldExit = false
        // do stuff
    

    Затем просто установите флаг true, когда вы хотите остановить поток, и он остановится при следующем проверке условия.

  • Если вы не можете дождаться завершения итерации и немедленно ее остановить, вы можете пойти за Thread.Abort, но убедитесь, что вы не можете оставить открытые файлы, сокеты, блокировки или что-нибудь еще подобное в несогласованном состоянии.

Ответ 2

Что такое безопасный способ остановить текущий поток?

Поместите поток в свой собственный процесс. Когда вы хотите, чтобы он остановился, убить процесс.

Это единственный безопасный способ убить поток. Отмена потока может серьезно дестабилизировать процесс и потерять пользовательские данные. Нет никакого способа избежать сценария "потерять пользовательские данные", если вы действительно действительно должны иметь возможность убивать поток, который может что-то делать. Единственный способ избежать дестабилизации процесса, требующего прерывания, - сделать их разными процессами полностью.