线程构造函数有时不返回(vc+;+;2014预览版) 我在C++ HTTP服务器中遇到了问题,有时创建一个新的线程来处理客户端请求不返回。我已经尝试了我能想到的一切(限制并发线程的数量),除了将线程数量限制为1之外,它并不能解决问题
这也发生在我的另一个程序中,也使用VC++2014预览编译器 这是一些发生问题的示例代码。我已经验证过,它有时会打印“即将创建新线程…”,但无法打印下一个“分离新线程…”或“结束接受…” 偶尔,在几分钟后,或者当我应用一些外部影响时(例如在调试器中暂停应用程序,这会显示代码当前似乎在线程构造函数中),程序最终会再次正确运行。我还验证了其他线程始终能够正确执行 线程数永远不会超过6或7,即使我以最快的速度刷新一个本地网页,其中包含约20个图像,因此我认为问题与一次线程过多无关 我能想到的唯一一件事是“threadCount”在说谎,因为我在线程函数的末尾递减它,但在递减时线程在技术上仍然存在。但我不认为这是问题所在,因为有时即使只刷新一个页面两次,线程构造也会挂起,而我的测试机有8个硬件线程 threadCount大于1或2时阻塞看起来是可靠的,但实际上可能不是。限制为4是不可靠的线程构造函数有时不返回(vc+;+;2014预览版) 我在C++ HTTP服务器中遇到了问题,有时创建一个新的线程来处理客户端请求不返回。我已经尝试了我能想到的一切(限制并发线程的数量),除了将线程数量限制为1之外,它并不能解决问题,c++,multithreading,sockets,visual-c++,C++,Multithreading,Sockets,Visual C++,这也发生在我的另一个程序中,也使用VC++2014预览编译器 这是一些发生问题的示例代码。我已经验证过,它有时会打印“即将创建新线程…”,但无法打印下一个“分离新线程…”或“结束接受…” 偶尔,在几分钟后,或者当我应用一些外部影响时(例如在调试器中暂停应用程序,这会显示代码当前似乎在线程构造函数中),程序最终会再次正确运行。我还验证了其他线程始终能够正确执行 线程数永远不会超过6或7,即使我以最快的速度刷新一个本地网页,其中包含约20个图像,因此我认为问题与一次线程过多无关 我能想到的唯一一件事
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
?它是函数还是类?我想你的线程入口点可能有问题。新启动的线程是否打印了很多消息,使得控制台输出中出现的“正在分离新线程…”比“即将创建新线程…”晚得多?