Windows:WaitForSingleObject在线程返回0时崩溃

我有一个奇怪的行为:WaitForSingleObject似乎崩溃时,我从我的线程返回0,但如果我调用“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创build线程,如下所示:

  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 

有谁知道为什么return语句会崩溃“WaitForSingleObject”吗? 我已经把WaitForSingleObject之前和之后的print语句,当线程存在时,我看到的行为是:“WaitForSingleObject之前”,“线程完成”,崩溃。 有没有人理解这种行为?