4

質問 1: スレッドを作成した後に join を呼び出すと、スレッド関数が戻るまで、それを呼び出したスレッドがブロックされると読みました。クライアントを受け入れ、それぞれのスレッドを作成できるマルチクライアントサーバーを構築しようとしています。問題は、最初のクライアントが参加してそのスレッドを作成し、join を呼び出した後、リッスン スレッドが終了するまでハングすることです。呼び出しスレッドをブロックせずにこのスレッドを実行するにはどうすればよいですか? (C# では、Start() を呼び出すだけで、呼び出しスレッドは通常どおり実行され続けます)。

質問 2: 一般的に (おそらく何か不足している可能性があります)、ブロック スレッドが必要になるのはなぜですか? そのポイントは何ですか?通常の関数を呼び出す方が簡単で高速ではないでしょうか?

C# のスレッドと同じことを達成する方法を誰かが説明してくれたら、それは素晴らしいことです!

前もって感謝します!私の悪い英語でごめんなさい。

4

2 に答える 2

4

呼び出しスレッドをブロックせずにこのスレッドを実行するにはどうすればよいですか

スレッドがまだ終了していない場合にオブジェクトdetach()のデストラクタが例外をスローしないように、スレッドを作成してから呼び出すことができます。threadこの種のファイア アンド フォーゲット デザインを採用する前に、よく考えることを正直にアドバイスします。C++11 では、std::async代わりに を呼び出すことができます (その場合は、この Q&A を参照してください。この Q&Aでは、その関数の現在の欠点に対する回避策が提案されています)。

一般的に(おそらく何かが欠けています)、なぜ誰かがブロッキングスレッドを必要とするのでしょうか? そのポイントは何ですか?通常の関数を呼び出す方が簡単で高速ではないでしょうか?

あなたのプログラムが、タスクが完了するのを待つ以外に何もすることがないのであれば、そうです - 同期呼び出しを使用するだけです。しかし、プログラムで何かを並行して実行したい場合があり、それが完了したら、続行するために非同期計算の終了を待つ必要がある場合があります。その場合、スレッドと結合する必要があります。

于 2013-05-11T16:39:46.900 に答える
3
  1. join() を呼び出さないでください。スレッドの実行が完了したことを確認する場合にのみ、スレッドに参加します (たとえば、スレッドを所有する接続マネージャー クラスを破棄する場合、スレッドの実行が完了したことを確認する必要があります)。
  2. join() をいつ呼び出すかについては、回答 1 を参照してください。
于 2013-05-11T16:37:32.967 に答える