У меня странное поведение: 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, как таковой:
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», пожалуйста? Я поместил оператор print до и после WaitForSingleObject, и один, когда поток существует, и я вижу следующее поведение: «До WaitForSingleObject», «Завершение потока», Crash. Кто-нибудь понимает это поведение, пожалуйста?
Задача ещё не решена.
Других решений пока нет …