2017-09-04 58 views
-2

我有一个客户端 - 服务器应用程序,我的服务器必须并行处理每个客户端请求。所以我决定为每个请求创建线程。这样做是个好主意吗?内部线程我将发送响应给客户端,所以我不打扰关闭线程。创建多个线程来处理多个请求是否很好?

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; 
} 
+0

是的,它被称为多线程服务器,但通常你只是捕捉连接,让线程读写客户端。 –

+7

如果不需要,创建多个线程是可以的,但是为每个请求创建一个线程是不好的。改用线程池。线程创建/销毁的代价很高,而且由于每个线程都需要自己的堆栈,因此它们需要大量的内存。根据需要尽可能多地使用,但不要多。 – Carcigenicate

+1

自C++ 11以来,您可以使用'std :: thread'。 – Jarod42

回答

0

这是个好主意,做这样吗?

不,这不是一个好主意。

由于Windows Vista和Server 2008可以使用(新)ThreadPool API

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

+0

我可以使用C++ 11 std :: thread来创建一个theradpool而不是OS相关的API吗? – impulse

+0

@impulse这不会那么高效(虽然更便于携带)。有了'std :: thread',你需要自己推出一个线程池。 – user0042

+0

@impulse无论如何,很容易包装到[C++接口](http://www.dorodnic.com/blog/2015/10/17/windows-threadpool/)。 – user0042