创建多个线程来处理多个请求是一种好习惯吗?
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 的值是一种好习惯吗?