如何在C中正常关闭线程

Knt*_*lii 5 c winapi

我有这样的事情:

DWORD WINAPI test(LPVOID lpParam) {
    while (1) {
        /*DO STUFF*/
    }
}

int main() {
    ...
    hThread = CreateThread(NULL,0,test,NULL,0,&dwThreadId);
    ...
}
Run Code Online (Sandbox Code Playgroud)

如何在没有TerminateThread()的情况下关闭线程?我的第一个想法是创建一个全局变量(shouldshutdown = 0/1),当Thread应该关闭时将它设置在main()中.然后在Thread中调用ExitThread().因此,我必须在线程的while循环中检查此变量,这是我猜的坏样式.

Sea*_*ean 11

您可以检查线程是否需要停止的事件.例如(没有错误处理):

DWORD WINAPI test(LPVOID lpParam) 
{
    HANDLE hEvent = (HANDLE)lpParam

    while (WaitForSingleObject(hEvent, 0) == WAIT_TIMEOUT) 
    {
        /*DO STUFF*/
    }
}

int main() {
    hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)
    hThread = CreateThread(NULL,0,test,(LPVOID)hEvent,0,&dwThreadId);
    // Do
    // Stuff
    // Tell the thread to exit
    SetEvent(hEvent)

    // Wait for the thread to exit
    WaitForSingleObject(hThread, INFINITE);
}
Run Code Online (Sandbox Code Playgroud)

一般模式是为线程提供某种可警告的对象,它可以监视它和其他东西可以设置.在这种情况下,我使用了手动重置事件.该while循环检查,看看是否该事件已发出信号,如果没有它的东西.当它被发出信号时,WaitForSingleObject它将返回WAIT_OBJECT_0并且循环将退出并且你将脱离线程函数.

在主函数中,在发出事件信号之后需要做的就是等待线程退出.