[英]How to safely close a THREAD which has a infinite loop in it
我正在使用_beginthreadex
函数创建一个线程。 我传入的函数地址有一个无限的 while 循环( while(1)
)。 我有threadid
和threadhandle
。
我可以使用TerminateThread(threadhandle,1);
但这是危险的。
安全的方法是使用_endthreadex
杀死线程,但它只能从线程内部使用,我想从外部杀死线程。
因此,请建议是否有一种安全的方法可以使用threadid
或threadhandle
从外部安全地关闭、结束或终止线程。
你应该- 从字面上看 -永远不要使用TerminateThread() 。 我什至不是在开玩笑。 如果从外部终止一个线程,则其中保留的所有资源都会泄漏,内部访问的所有状态变量都将处于未确定状态等等。
您的问题的解决方案可能是让您的线程自行完成。 它可以通过线程安全方式更改的 volatile 变量(参见InterlockedIncrement() )、Windows 事件或类似的东西来完成。 如果您的线程有消息循环,您甚至可以通过发送消息要求它停止来实现。
正确的方法是使用 CreateEvent 创建一个事件“杀死我”,然后在您希望杀死线程时标记此事件。 与其让你的线程等待while(1)
, while(WaitForSingleObject(hevent_killme, 0))
让它等待while(WaitForSingleObject(hevent_killme, 0))
。 然后你可以简单地让线程回调完成并返回,不需要调用 _endthreadex 之类的。
回调函数示例:
static DWORD WINAPI thread_callback (LPVOID param)
{
...
while(WaitForSingleObject(hevent_killme, 0) != WAIT_OBJECT_0)
{
// do stuff
}
return 0;
}
呼叫者:
HANDLE hevent_killme = CreateEvent(...);
...
void killthread (void)
{
SetEvent(hevent_killme);
WaitForSingleObject(hthread_the_thread, INFINITE);
CloseHandle(hevent_killme);
CloseHandle(hthread_the_thread);
}
永远不要使用 TerminateThread。
您可以使用while(continue_running)
代替while(1)
,当线程循环应该运行时, continue_running
为True
。 当您想停止线程时,将控制线程设置为continue_running
为False
。 当然,请确保使用互斥锁正确保护continue_running
,因为它是一个可以从两个线程修改其值的变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.