【问题标题】: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 来避免为每个传入请求创建新线程的开销。
  • “所以我不会为关闭线程而烦恼。”你应该这样做。

标签: c++ windows multithreading


【解决方案1】:

这样做是个好主意吗?

不,这不是一个好主意。

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

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

【讨论】:

  • 我可以使用 C++ 11 std::thread 创建一个 theradpool 而不是 OS 相关的 API 吗?
  • @impulse 这不会那么高效(虽然更便携)。使用std::thread,您需要自己滚动一个线程池。
  • @impulse 无论如何都很容易包装成c++ interface
猜你喜欢
  • 2020-12-14
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 2010-12-30
  • 2014-11-09
  • 2017-04-27
相关资源
最近更新 更多