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

OS関連のAPIの代わりにC++ 11 std :: threadを使ってtheradpoolを作成できますか? – impulse

+0

@impulseそれはそれほど効率的ではありません。 'std :: thread'では、自分でスレッドプールをロールバックする必要があります。 – user0042

+0

@impulse [C++インターフェイス](http://www.dorodnic.com/blog/2015/10/17/windows-threadpool/)に簡単にラップできます。 – user0042

関連する問題