0

計算量の多いプログラムを書く必要があります。そのため、計算を行う前に、データベースからメモリにデータをロードする必要があります (毎回データベースからデータをフェッチする時間を節約するためです。

プログラムを Web サービスにして、多くのクライアントが複数の計算を同時に実行できるようにしたいと考えています。

読み込みデータはかなりの量のメモリを必要とするため、すべての計算で同じデータ (グローバル データ) を共有する必要があります。

ただし、2 人のユーザーが同時に同じデータをロードするように要求した場合、1 人が既にデータをロードしているときに同期の問題が発生し、2 番目のユーザーが同じデータを再度ロードし始めます。

特にこれのためにスレッドロックを行う必要がありますか? Web サービスはマルチスレッド プログラミングを意味しますか? 私は C++ プログラマーなので WWS (windows web service) を使用する予定ですが、以前は純粋なアルゴリズムしか扱っていなかったので、これは初めてのことです。

混乱させてすみません。

どうもありがとうございました。

4

2 に答える 2

0

データ読み込みの問題を解決するには、データが読み込まれたかどうかを確認する load メソッドがシングルトンにあるシングルトン パターンの使用を検討してください。ロードされていない場合は、ミューテックス/モニター/etc が取得されます。データがロードされているかどうかを再度確認し、データがロードされていない場合は、データ ロード済みフラグを設定し、ミューテックス/モニター/etc を解放します。

マルチスレッド化する必要のない Web サーバーはありません。クライアントの対話を管理するミドルウェアに応じて、すべてのサービス要求が順次処理されるように指定できる必要があります。マルチプロセッサ システムで実行している場合は、処理能力の一部しか使用できないことに注意してください。

サーバーが共有データを変更しない場合、正しい/適切なマルチスレッド動作を行うために同期がほとんどまたはまったく必要ない可能性があります。ロック コードの複雑さは、変更される共有データの量と、変更されたデータに対する競合のレベルに比例します。

于 2012-06-21T04:39:40.060 に答える
0

各クライアントを確実に区別できる場合は、それぞれのコンテキストを作成できます。クライアントが切断されるか、指定された時間アイドル状態のままになると、そのコンテキストが期限切れになる可能性があります。

さらに、各クライアントが複数の「計算要求」を同時に実行できるようにする場合は、これらの要求をそれぞれ識別し、クライアント コンテキストでそれらを追跡する独自の方法が必要です。たとえば、ユーザーが 1 つの処理タスクと 2 つのキューに入れられたタスクを持っている場合、そのコンテキストは 3 つのタスクを同時に追跡し、それぞれに独自の状態 (キューに入れられ、実行中、および完了) があります。

「計算リクエスト」の処理がいつ完了したかを識別するために、クライアントは、関心のある「計算リクエスト」の一意の識別子を通知して、サービスのポーリングを続けることができます。

ロックが必要かどうかは、問題を解決するために採用するアーキテクチャによって異なります。「グローバルデータ」は読み取り専用ですか? はいの場合、アクセスするためにロックは必要ありません。それ以外の場合は、そうする可能性が高くなります (このデータの保存方法によって異なります)。HTTP Web サービスを使用し、セッション (Cookie) を使用して各ユーザーを追跡することをお勧めします。しかし、私はあなたの要件を知らないので、それは闇の中のショットです. ここで提案する設計に従い、接続ごとのスレッドを使用する場合は、コンテキストごとに少なくとも 1 つのロック (ユーザーが複数の要求を同時に送信する可能性がある場合) と、へのアクセスを保護するための 1 つのロックが必要になります。コンテキスト リスト。

于 2012-06-11T03:51:28.510 に答える