我的一位朋友正在尝试用C ++编写的自定义http服务器,以便在Linux中运行。我试图帮助他,但我发现的一切似乎都太明显了。
每次请求进入时,应用程序都会创建一个线程。该线程为请求提供服务并结束。在一些请求(超过300个)之后,不再创建新线程。
我发现所有可以创建的线程都有限制。但看起来完成的线程仍然存在。这是代码的问题还是线程处理程序永远不会被释放?
这是我的朋友从应用程序中提取的一些代码:
pthread_t threadID;
StartingArgs *arg = new StartingArgs( &(this->cameraCounts), mapToSend,&(this->mapMutex), &(this->mutex), this->config );
if( pthread_create(&threadID, NULL, (this->startingRoutine) , (void*)arg ) != 0 )
{
ConsoleMessages::printDate();
cout<< "snapshot maker: new thread creation failed\n";
}
void *CameraCounter::startingRoutine( void *arg )
{
//stuff to do. removed for debugging
delete realArgs;
return NULL;
}
答案 0 :(得分:7)
看起来你有一堆“可加入的”线程。他们正在等待有人在他们身上调用pthread_join()。如果您不想这样做(例如,获取线程的返回值),您可以将线程创建为“已分离”:
pthread_t threadID;
pthread_attr_t attrib;
pthread_attr_init(&attrib);
pthread_attr_setdetachstate(pthread_attr_t &attrib, PTHREAD_CREATE_DETACHED);
StartingArgs *arg = new StartingArgs( &(this->cameraCounts), mapToSend,&(this->mapMutex), &(this->mutex), this->config );
if( pthread_create(&threadID, &attrib, (this->startingRoutine) , (void*)arg ) != 0 )
{
ConsoleMessages::printDate();
cout<< "snapshot maker: new thread creation failed\n";
}
pthread_attr_destroy(&attrib);
void *CameraCounter::startingRoutine( void *arg )
{
//stuff to do. removed for debugging
delete realArgs;
return NULL;
}
答案 1 :(得分:2)
完成后你必须加入线程(pthread_join
,也看wait(2)
)或将SIGCHILD处理程序设置为SIG_IGN。
答案 2 :(得分:2)
我建议你的朋友创建一个线程池,并将工作项发布到线程池。如果有可用的线程来为工作项提供服务,则会分配一个线程并给定工作项。如果没有可用的线程,则请求应该挂起,直到新线程可用。通过这种方式,他可以在拒绝服务攻击期间保护自己免于耗尽过多的系统资源。
如果一次不可能处理不超过30个请求,则线程池最多应包含30个线程。然后,系统资源分配在拒绝服务攻击期间是可预测的,而不依赖于任意系统限制。