C++ 如何阻止由_beginthreadex创建的线程在win32中挂起
我正在尝试学习winsock,我正试图让服务器处理多个请求,我遇到了以下答案: 很好,现在我有一个代码,看起来像这样我会跳过整个代码,并把我认为是重要的,如果你认为你可以帮助,但需要澄清,请不要犹豫告诉我C++ 如何阻止由_beginthreadex创建的线程在win32中挂起,c++,multithreading,winapi,winsock,C++,Multithreading,Winapi,Winsock,我正在尝试学习winsock,我正试图让服务器处理多个请求,我遇到了以下答案: 很好,现在我有一个代码,看起来像这样我会跳过整个代码,并把我认为是重要的,如果你认为你可以帮助,但需要澄清,请不要犹豫告诉我 void NetworkServer::acceptClientSocket() { sockaddr * dummy = NULL; while (ClientSocket = accept(ListenSocket, dummy, NULL)){ if (ClientSo
void NetworkServer::acceptClientSocket()
{
sockaddr * dummy = NULL;
while (ClientSocket = accept(ListenSocket, dummy, NULL)){
if (ClientSocket == INVALID_SOCKET) {
printf("accept failed with error: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
exit(1);
}
unsigned threadID;
hThread = (HANDLE)_beginthreadex(NULL, 0, &handleClientRequest, (void*)ClientSocket, 0, &threadID);
}
closesocket(ListenSocket);
}
handleClientRequest函数如下所示:
unsigned __stdcall handleClientRequest(void* data)
{
SOCKET client_socket = (SOCKET)data;
DataReceiver dataReceiver(client_socket);
dataReceiver.receiveClientData();
return 1;
}
经过数小时的调试,我看到程序到达返回值,然后挂起。我知道之后会立即调用_endthreadex,但程序仍然挂起。数据接收器是一个根据调试器完美完成其工作的对象
请提供帮助。Visual Studio的调试器将使用黄色箭头显示下一条语句。如果您没有当前语句的源代码,那么看起来当前语句已经运行完毕。打开“反汇编”窗口以实际查看当前的组装说明。在您的情况下,如果没有dataReceiver.receiveClientData的源代码,则返回1可能是当前语句。如果后者不是阻塞调用,我会感到惊讶,因此您当前的语句可能在其中。@IInspectable我已经按照您所说的做了,我发现它到达了“call u endthreadex 0F1A36E0h”行,并在运行模式下显示反汇编。而且它还没有到达闭合的插座线。调试器实际上到达了return1语句,然后我转到disassembler@IInspectable在调用endthreadex之后,我有一个调用add esp,4,但它从来没有达到反汇编程序允许的程度。在我看来,它就像鸡和蛋一样。while循环只有在accept失败时才会停止。唯一的办法就是在关机时猛拉地板垫。你似乎有错误的思维模式。每个线程都是一个独立的执行单元。当_beginthreadex返回时,将发出对closesocket的调用。这通常发生在新线程调用_endthreadex之前很长一段时间_beginthreadex不会等待线程终止—它会启动它,然后在新线程运行时立即返回。