我在我的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;
}