线程构造函数有时不返回(vc+;+;2014预览版) 我在C++ HTTP服务器中遇到了问题,有时创建一个新的线程来处理客户端请求不返回。我已经尝试了我能想到的一切(限制并发线程的数量),除了将线程数量限制为1之外,它并不能解决问题

线程构造函数有时不返回(vc+;+;2014预览版) 我在C++ HTTP服务器中遇到了问题,有时创建一个新的线程来处理客户端请求不返回。我已经尝试了我能想到的一切(限制并发线程的数量),除了将线程数量限制为1之外,它并不能解决问题,c++,multithreading,sockets,visual-c++,C++,Multithreading,Sockets,Visual C++,这也发生在我的另一个程序中,也使用VC++2014预览编译器 这是一些发生问题的示例代码。我已经验证过,它有时会打印“即将创建新线程…”,但无法打印下一个“分离新线程…”或“结束接受…” 偶尔,在几分钟后,或者当我应用一些外部影响时(例如在调试器中暂停应用程序,这会显示代码当前似乎在线程构造函数中),程序最终会再次正确运行。我还验证了其他线程始终能够正确执行 线程数永远不会超过6或7,即使我以最快的速度刷新一个本地网页,其中包含约20个图像,因此我认为问题与一次线程过多无关 我能想到的唯一一件事

这也发生在我的另一个程序中,也使用VC++2014预览编译器

这是一些发生问题的示例代码。我已经验证过,它有时会打印“即将创建新线程…”,但无法打印下一个“分离新线程…”或“结束接受…”

偶尔,在几分钟后,或者当我应用一些外部影响时(例如在调试器中暂停应用程序,这会显示代码当前似乎在线程构造函数中),程序最终会再次正确运行。我还验证了其他线程始终能够正确执行

线程数永远不会超过6或7,即使我以最快的速度刷新一个本地网页,其中包含约20个图像,因此我认为问题与一次线程过多无关

我能想到的唯一一件事是“threadCount”在说谎,因为我在线程函数的末尾递减它,但在递减时线程在技术上仍然存在。但我不认为这是问题所在,因为有时即使只刷新一个页面两次,线程构造也会挂起,而我的测试机有8个硬件线程

threadCount大于1或2时阻塞看起来是可靠的,但实际上可能不是。限制为4是不可靠的

atomic_int threadCount = 0;
bool Server::checkForNewConnection()
{
    sockaddr clientAddress;
    socklen_t clientAddressLength = sizeof(clientAddress);
    fd_set readSet;
    FD_ZERO(&readSet);
    FD_SET(this->serverSocket, &readSet);

    const auto clientSocket = accept(this->serverSocket, &clientAddress, &clientAddressLength);

    cout << "Incremented threadcount: " << ++threadCount << endl;

    if (clientSocket < 0 || clientSocket == INVALID_SOCKET)
    {
        closesocket2(clientSocket);
        return false;
    }

    sockaddr_in* add2;
    add2 = reinterpret_cast<sockaddr_in*>(&clientAddress);

    const string clientAddressString(inet_ntoa(add2->sin_addr));

    cout << "About to create new thread..." << endl;
    thread serverThread(&ForkThread, this, clientSocket, clientAddressString, false);
    cout << "Detaching new thread..." << endl;
    serverThread.detach();
    cout << "Ending accept..." << endl;

    return true;
atomic_int threadCount=0;
bool服务器::checkForNewConnection()
{
sockaddr客户地址;
socklen_t clientAddress length=sizeof(clientAddress);
fd_集readSet;
FD_零(读取集和读取集);
FD_集(此->服务器套接字和读取集);
const auto clientSocket=accept(此->服务器套接字,&clientAddress,&clientAddressLength);

你能用生产/稳定的编译器版本试试吗?@JohnZwinck我可以用g++试试。@JohnZwinck我用VC++2013试过,但没能失败。但我目前的测试能力是在我的浏览器中以最快的速度混合f5。如果它在VC++2013中工作,你可能应该将它作为一个bug报告给微软。什么t是
forkshread
?它是函数还是类?我想你的线程入口点可能有问题。新启动的线程是否打印了很多消息,使得控制台输出中出现的“正在分离新线程…”比“即将创建新线程…”晚得多?