std :: thread构造函数有时不返回(vc ++ 2014预览版)

时间:2015-01-07 08:41:09

标签: c++ multithreading sockets visual-c++

我在我的C ++ HTTP服务器中遇到问题,有时创建一个新线程来处理客户端请求不会返回。我已经尝试了所有我能想到的(限制并发线程数),除了将线程数限制为1之外,它还没有解决。

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

这是发生问题的一些示例代码。我已经确认它有时打印出“关于创建新线程......”但是无法打印出下一个“脱离新线程......”或“结束接受......”

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

线程数永远不会超过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;

}

0 个答案:

没有答案