Jim's GameDev Blog

关于 Thread.Abort

2017-6-13

关于 Thread.Abort 这个 beast 有很多讨论,就是要避免使用这个方法来终止线程。下面我结合自己的使用情况来说明下,使用 Thread.Abort 的问题。

测试中发现, Abort 并不像它的名字那样,会立刻终止线程。当线程是运算密集型时,并且 CPU 还有很多运算资源时,线程会一直处于 Running 状态,即使调用 Abort 也不会终止线程。只能在密集型运算中加入 Thread.Sleep,主动将线程进入 WaitSleepJoin 状态一段时间,才能有效果。所以,使用 Abort 来让线程终止是不可靠的。

占有任何类型资源的线程都不应该被 Abort。所谓资源就是锁以及 IO 相关的东西,其它的暂时还没遇到。因为 Abort 会导致锁和 IO 无法被正确的释放,也就导致其他线程再也无法访问这个资源了,除非进程被 Kill。在 Csharp 中,使用 using 关键字可以确保资源被正确的释放,但是如果牵扯到 Abort,那就另当别论了,Abort 会导致 using 块非正常结束,所以也就无法释放资源。

那么什么情况下可以使用 Abort,只有一种情况,就是线程执行的是一个独立的算法,不需要和任何资源(锁、IO)发生交互,只存取局部变量,这时可以认为 Abort 是没有副作用的。但是还要记住上文提到的一点,Abort 不是立即的。这么看来 Abort 真没什么用了。

所以最后的结论就是不要用 Abort,而是使用 Interlocked flag,signal 等方法。