创建多个线程来处理多个请求是一种好习惯吗?

Posted

技术标签:

【中文标题】创建多个线程来处理多个请求是一种好习惯吗?【英文标题】:is it good practice to create multiple threads to handle multiple request? 【发布时间】:2017-09-04 17:25:25 【问题描述】:

我有一个客户端-服务器应用程序,我的服务器必须并行处理每个客户端请求。所以我决定为每个请求创建线程。这样做是个好主意吗?在线程内部,我将向客户端发送响应,因此我不会为关闭线程而烦恼。

void MyThreadFunction()

    //Process request and send response to client
    //.....
    //.....
    return;


int main()

    //.....
    //.....

    while(true)
    
        DWORD   dwThreadId;

        if(!receive(clientid, data)) //API to receive data from client
        break;

        CreateThread(NULL, 0, MyThreadFunction, NULL, 0, &dwThreadId);   
    

    return 1;

【问题讨论】:

是的,它被称为多线程服务器,但通常你只是捕获连接并让线程读取和写入客户端。 如果没有必要,创建多个线程是可以的,但是为每个请求创建一个线程是不好的。请改用线程池。线程的创建/销毁成本很高,并且它们需要大量内存,因为每个线程都需要自己的堆栈。尽可能多地使用,但不要更多。 自 C++11 起你可以使用std::thread 最好使用 ThreadPool API 来避免为每个传入请求创建新线程的开销。 “所以我不会为关闭线程而烦恼。”你应该这样做。 【参考方案1】:

这样做是个好主意吗?

不,这不是一个好主意。

从 Windows Vista 和 Server 2008 开始,您可以使用(新)ThreadPool API。

为每个传入请求显式创建一个新线程会产生一定的开销,并且会降低您的服务器性能。

【讨论】:

我可以使用 C++ 11 std::thread 创建一个 theradpool 而不是 OS 相关的 API 吗? @impulse 这不会那么高效(虽然更便携)。使用std::thread,您需要自己滚动一个线程池。 @impulse 无论如何都很容易包装成c++ interface。

以上是关于创建多个线程来处理多个请求是一种好习惯吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 std::thread 创建的线程中调用 pthread_sigmask 是一种好习惯吗?

使用“视图”进行分组是一种好习惯吗?

向 POCO 添加方法或创建单独的类来更新 POCO 的值是一种好习惯吗?

在带弹簧休息的全局异常处理程序中使用通用异常类处理程序是一种好习惯吗?

为模型创建许多 DTO 是一种好习惯吗?

使用引用来布置简单的功能是一种好习惯吗