Linux C ++线程已经死了,但是“挂起” - 线程限制

时间:2010-10-22 22:18:21

标签: c++ multithreading limit

我的一位朋友正在尝试用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;
}

3 个答案:

答案 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个线程。然后,系统资源分配在拒绝服务攻击期间是可预测的,而不依赖于任意系统限制。