2017-09-04 69 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