3

我有一个奇怪的行为:当我从我的线程返回 0 时,WaitForSingleObject 似乎崩溃了,但如果我调用“ExitThread(0)”,那么它不会。

void waitForThread(DWORD &threadId)
{
    HANDLE hThread = OpenThread(SYNCHRONIZE,
                        FALSE,
                        threadId);

    if (hThread == NULL) return;

    WaitForSingleObject(hThread, INFINITE); // Crashes here (not even returning)
    CloseHandle(hThread);
}

根据文档:

ExitThread 是在 C 代码中退出线程的首选方法。但是,在 C++ 代码中,线程在调用任何析构函数或执行任何其他自动清理之前退出。因此,在 C++ 代码中,您应该从您的线程函数返回。

这对我来说没有意义。我认为我的函数中带有签名的“返回0”:

DWORD WINAPI foo(LPVOID arg);

会好的。为了完整起见,线程是使用 CreateThread 创建的,如下所示:

    DWORD threadId;
    HANDLE pth = CreateThread(NULL, // Default security attributes
                    0, // Default stack size
                    foo, // Thread name
                    arg, // Argument to thread
                    0, // Default creation flag
                    &threadId); // Returns thread ID

有谁知道为什么返回语句会崩溃“WaitForSingleObject”吗?我在 WaitForSingleObject 之前和之后放置了 print 语句,当线程存在时,我看到的行为是:“在 WaitForSingleObject 之前”,“线程完成”,Crash。请问有人理解这种行为吗?

4

0 回答 0