2017-10-19 13 views
0

私はC++ベースのマルチスレッドチャットサーバーを作成しています。スレッドオブジェクトを破棄する方法

新しいクライアントが参加すると、メインスレッドは新しいスレッドを作成してクライアントを管理します。

クライアントの接続が切断されたときにスレッドを破棄したいので、クライアントがTerminate()が呼び出されたときにクライアントがこの機能を正しく設定できるようにします。

しかし、Terminate()では、単一のスレッドだけを破壊するのではなく、すべてのスレッドを破壊しました。

破壊したいスレッドだけが破壊されるようにするためにはどうすればよいですか?

+1

Hmm。通常、スレッドはメイン関数から戻るときに終了します。 – Scheff

+0

あなたはこれがあなたが望むデザインだと確信していますか?後でスケーラビリティ問題のレシピです –

+0

@David Hamim私は12年生のコンピュータサイエンスプロジェクトのためにこのプロジェクトを行っています。 スケーラビリティと効率性は、自分のレベルが非常に進んでいるので、スケーラビリティと効率性は私の懸念事項ではありません(シラバスはC++の基本、クラス、データ処理、リンクリストのスタックとキューです)。 – Vedant

答えて

2

特別な操作は必要ありません。

std::threadは、そのコンストラクタ内のパラメータとして呼び出し可能なものを取得し、その呼び出し可能関数はスレッドが実行する関数です。

呼び出し元がある時点で終了した場合、切り離されたスレッドは自身をクリーンアップできます。 クライアントの接続が切断さ

  • は、単純なデザインは、これと同様のことができるスレッド
  • を取り外すときだけ、クライアント・ハンドリング機能から

    • 終了していることを確認します

      while(server.is_on()){ 
          auto client = server.acccept_client(); 
          std::thread thread([client = std::move(client)]{ 
          handle_client_until_disconnection(client); 
          }); 
          thread.detach(); 
      } 
      

      別のアプローチは、スレッドプールを使用することです。そのスレッドプールは、アプリケーションが起動すると構築され、アプリケーションが終了すると破棄されます。

    +0

    Thankyou @David Hamim – Vedant

    関連する問題