我使用CreateThread()函数创建了一个VC ++线程,我想知道如何从外部函数终止创建的线程。
e.g。
HANDLE Handle_Of_Thread_1 = CreateThread( NULL, 0,Thread_no_1, &Data_Of_Thread_1, 0, NULL);
void Thread_no_1
{
}
我的问题是如何终止我从外部函数创建的线程。
答案 0 :(得分:2)
您可以使用TerminateThread
功能,但通常应保留用于紧急情况。当你使用它时,线程会在 no 之后自行清理,这很容易使整个进程处于不稳定状态。
大多数情况下,您希望向线程发送某种信号,以告诉它在此过程中正常退出,释放资源等。这可以通过多种方式完成,例如设置定期检查的事件。
答案 1 :(得分:1)
MSDN中记录了一个函数TerminateThread
。但是,请注意,这通常是管理线程的一种不好方法。来自MSDN:
TerminateThread是一个危险的函数,只能在最极端的情况下使用。只有当您确切知道目标线程正在执行的操作时,才应调用TerminateThread,并且您可以控制目标线程在终止时可能正在运行的所有代码。例如,TerminateThread可能会导致以下问题:
- 如果目标线程拥有临界区,则不会释放临界区。
- 如果目标线程正在从堆中分配内存,则不会释放堆锁。
- 如果目标线程在终止时正在执行某些kernel32调用,则线程进程的kernel32状态可能不一致。
- 如果目标线程正在操纵共享DLL的全局状态,则DLL的状态可能会被破坏,从而影响DLL的其他用户。
通常最好以某种方式用信号通知线程(例如线程偶尔检查的布尔变量bQuitRequested
)请求线程退出,然后让线程自行清理并自然退出{{1 }}。调用进程/线程可以使用ExitThread
,传递线程句柄。这将阻塞,直到线程自然退出,或者直到超时为止。
答案 2 :(得分:1)
有各种可能性:
1)使用TerminateThread()API。如果线程没有保存其他线程/进程可能/将要求的其他资源的锁,那么很好。请注意,这组线程非常小并且难以准确定义 - 除非您绝对确定它是安全的,否则不要使用此方法(实际上,这意味着“不要使用它”)。
2)如果线程功能是CPU密集型的,则在线程中的某个适当级别轮询“Abort”布尔值,以便终止足够及时,但不会过多地影响其工作(即,可能不是最内层的循环)
3)如果线程通常在某些API上被阻塞,请尝试“早期”满足API条件,以便线程可以运行,从而检测中止布尔值。确切的使用机制取决于特定的阻塞API。
4)仅在应用程序关闭时终止线程,即。当其他一些线程(通常是主GUI线程)调用ExitProcess()时,让操作系统执行此操作。这需要一些设计约束,例如。除了通过比它们更长的结构/机制之外,线程之间没有通信。
RGDS, 马丁