2011-01-31 10 views
0

キューが長く、キュー内のすべての要素が複数(TCP)サーバーに送信される である必要があるc/C++プロセスがあります。シングルスレッドは動作するオプションですが、遅いです。注文を維持する必要があるマルチスレッドジョブ

マルチスレッドソリューションを実装する必要があります。私のプロセスでは、サーバの数があらかじめわかっていません。 最初のアイデアは、すべてのサーバーに1つのスレッドを作成することです。マネージャスレッドは を読み取ります。キュー内の新しい要素が宛先を検出し、宛先に一致するスレッドにディスパッチします。

重要な注意点です。ジョブは依存している可能性があります。 job_5が完了していなければjob_10を実行したくありません。注文を維持する必要があります。

まず、この問題についてご意見をお聞かせください。 2番目は、参照用にC++の実装を探しています。第3に、同様の問題を記述した書籍/情報源を探しています。

+0

何を意味していますか?新しい接続のためのフォーク? – cateof

+0

この問題の実際の解決策は[Asynchronous IO](http://think-async.com/)です –

+0

私はスレッドプーリングを調べることをお勧めします。 「マルチスレッド」の概念は、一般にクライアントごとのスレッドとして認識されます。スレッドプールは、すべての時間を必要としないスレッドを取り除く効率的な方法です。 – RageD

答えて

3

boost asioを見ましたか?これは "スレッドプール"という概念をサポートしているため、サーバーごとに1つのスレッド(同期)ではなく、多数の接続を非同期に処理するスレッドのプールを持つことができます。パフォーマンスはそれほど悪くはありません...

+0

+1スレッドプールに言及するため+1。 – RageD

+0

同じです。私を保存して答えを加えました。スレッドの作成はかなり重いので、次のリクエストが入ったときに別のスレッドを開始する必要があるだけで、スレッドを終了しないほうがずっと優れています。 –

+0

問題は私も注文を維持する必要があることです。たとえば、job_1はthread_1を参照し、job_2が同じ接続に送信されるためには完了する必要があります。 – cateof

0

マルチスレッドソリューションが必要であるとの結論に至りましたか?あなたのシングルスレッドソリューションが「遅い」と言ったら、どういう意味ですか?あなたはアイテムがサーバーに送信されている間、他の処理(たぶんUIスタッフ?)が開催されていることを意味しますか?あるいは、プロセス全体が時間がかかりすぎるのか?

この質問では、各項目をすべてのサーバーに送信する必要があるのか​​、まったく送信する必要があるのか​​は不明です。ただ1つのようだが、わからない。すべてに送信する必要がある場合は、マルチスレッドソリューションの複雑さが大幅に増加します。

送信されたアイテムをキューから削除できますか、またはサーバーからの確認を待つ必要がありますか?待機する必要がある場合は、キュー管理が難しくなります。承認されるまでアイテムを削除することはできません。何らかの理由で保留中とマークする必要があります。キューから次のアイテムを選択するスレッドには、保留中のアイテムを選択しないようにします。アイテムが正常に送信されたら、キューから削除する必要があります。これは、キューへの同時書き込みアクセスを意味します。

どのようにエラーを処理しますか?アイテムを送信できない場合は、後で再試行するためにキューに残りますか、失敗したリストに移動したか、ログに記録されて破棄されただけですか?マルチスレッドシステムでは、エラーを非同期的に学習します。これは、エラー処理プロシージャへの同時書き込みアクセスを意味します。

あなたのプロセスは、そこにいくつのサーバーがあるかをあらかじめ知っていると言います。処理中にこの番号が変更できますか?

マルチスレッド化については、「低速」のシングルスレッドソリューションが、ビジネスニーズに最も適した、実装が容易で信頼性の高いソリューションであることがわかります。そうでなければ、これらの質問のいくつかがあなたに役立つことを願っています。

+0

各アイテムは1つのサーバーに送信する必要があり、ACKを待つ必要があります。エラーのケースはログに記録され、破棄されます。クライアントはあらかじめサーバーの数を知っていることはありません。 tcpタイムアウトが大きいため、単一スレッドが遅くなる可能性があります。たとえば、10秒間待つ必要がある場合があります。 – cateof

+1

各アイテムを1台のサーバーに送信し、ACKを待っています.Nimの提案は良いフィット感があります。あなたは、アイテムを順番に保管することについても言及しました。おそらく、サーバーに関係なく、すべてのアイテムの中から注文するのではなく、指定されたサーバー向けのアイテムを注文することを意味しますか? –

関連する問題