VC-有TerminalThread的替代方式吗?

VC-有TerminalThread的替代方式吗?

灵芸 发布于 2017-06-27 字数 205 浏览 1287 回复 2

一般在处理线程的时候最好不要使用TerminalThread函数,因为这样会造成堆栈被破坏。但是在有些情况下,要马上结束线程,就只有调用TerminalThread。请问,有能达到TerminalThread的效果而没有它的副作用的方式吗?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜柠檬 2017-10-12 2 楼

Jeffrey Richter在"MSJ March, 1996"的Q&A:Win32里对这个问题做了详尽的阐述,并提供了一个很巧妙但并不完美的解决办法。基本思路是让目标线程产生一个异常,通过异常展开,系统会为所有局部C++对象调用析构函数,然后退出线程,由于是线程自己退出,线程栈会被释放,所有DLL也会收到DLL_THREAD_DETACH通知。但是无法解决潜在的死锁问题。

让目标线程产生一个异常很简单,只要用GetThreadContext然后SetThreadContext,把eip改到自己的一段代码,然后调用RaiseException即可。

想挽留 2017-10-10 1 楼

TerminalThread 会带来以下问题:

未释放互斥区,造成死锁(整个进程在分配和回收内存时,都要用同一把锁。如果一个线程在占用该锁时被杀死(即临死前该线程在new或delete操作中),其他线程就无法再使用new或delete了,表现为hang住)
未释放堆分配锁,造成死锁(同上)
在执行内核函数时退出,造成该线程所在进程状态不确定,程序可能崩溃
在使用DLL时退出,造成DLL被销毁,其他使用该DLL得程序可能出现问题!

怎么解决呢:

两种解法:

用同步机制来控制线程退出,如果同步机制被唤醒,由线程自己来执行资源释放和退出纯种的功能。
定时检查,每隔一段时间去检查一个标志,当标志被改时,自动退出