Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何阻止由_beginthreadex创建的线程在win32中挂起_C++_Multithreading_Winapi_Winsock - Fatal编程技术网

C++ 如何阻止由_beginthreadex创建的线程在win32中挂起

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

我正在尝试学习winsock,我正试图让服务器处理多个请求,我遇到了以下答案:

很好,现在我有一个代码,看起来像这样我会跳过整个代码,并把我认为是重要的,如果你认为你可以帮助,但需要澄清,请不要犹豫告诉我

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不会等待线程终止—它会启动它,然后在新线程运行时立即返回。