如何安全地关闭其中有无限循环的线程
How to safely close a THREAD which has a infinite loop in it
我正在使用 _beginthreadex
函数创建线程。我传入的函数地址有一个无限循环 (while(1)
) 。我有 threadid
和 threadhandle
.
我可以用TerminateThread(threadhandle,1);
但是很危险。
安全的方法是使用_endthreadex
终止线程,但它只能在线程内部使用,而我想从外部终止线程。
所以请建议是否有安全的方法从外部使用 threadid
或 threadhandle
.
安全地关闭、结束或终止线程
正确的方法是使用 CreateEvent 创建事件 "kill me",然后在您希望终止线程时标记此事件。不要让线程等待 while(1)
,而是让它等待 while(WaitForSingleObject(hevent_killme, 0))
。然后你可以简单地让线程回调完成 return,不需要调用 _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。
你应该 - 字面上 - 永远不要使用 TerminateThread(). 而我甚至没有开玩笑。如果您从外部终止线程,其中保留的所有资源都将被泄漏,内部访问的所有状态变量都将处于未确定状态等。
您的问题的解决方案可能是发出线程自行完成的信号。它可以通过线程安全方式更改的 volatile 变量(参见 InterlockedIncrement())、Windows 事件或类似的东西来完成。如果您的线程有消息循环,您甚至可以通过发送消息要求它停止来实现。
您可以使用 while(continue_running)
而不是 while(1)
,其中 continue_running
是 True
,而线程循环应该 运行。当你想停止线程时,让控制线程设置continue_running
到False
。当然,请确保使用互斥锁正确保护 continue_running
,因为它是一个可以从两个线程修改其值的变量。
我正在使用 _beginthreadex
函数创建线程。我传入的函数地址有一个无限循环 (while(1)
) 。我有 threadid
和 threadhandle
.
我可以用TerminateThread(threadhandle,1);
但是很危险。
安全的方法是使用_endthreadex
终止线程,但它只能在线程内部使用,而我想从外部终止线程。
所以请建议是否有安全的方法从外部使用 threadid
或 threadhandle
.
正确的方法是使用 CreateEvent 创建事件 "kill me",然后在您希望终止线程时标记此事件。不要让线程等待 while(1)
,而是让它等待 while(WaitForSingleObject(hevent_killme, 0))
。然后你可以简单地让线程回调完成 return,不需要调用 _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。
你应该 - 字面上 - 永远不要使用 TerminateThread(). 而我甚至没有开玩笑。如果您从外部终止线程,其中保留的所有资源都将被泄漏,内部访问的所有状态变量都将处于未确定状态等。
您的问题的解决方案可能是发出线程自行完成的信号。它可以通过线程安全方式更改的 volatile 变量(参见 InterlockedIncrement())、Windows 事件或类似的东西来完成。如果您的线程有消息循环,您甚至可以通过发送消息要求它停止来实现。
您可以使用 while(continue_running)
而不是 while(1)
,其中 continue_running
是 True
,而线程循环应该 运行。当你想停止线程时,让控制线程设置continue_running
到False
。当然,请确保使用互斥锁正确保护 continue_running
,因为它是一个可以从两个线程修改其值的变量。