2009-06-14 1 views
0

私はparrallelのテキストの複数の箇所から単語を数える方法を持つC#ライブラリを作成しました。テキストのパッセージは文字列として与えられ、getnextchar()が呼び出されるたびにランダムな遅延があります。私のライブラリメソッドは、これらの文字ストリームの配列を取って、結合された単語頻度カウントを返す必要があります。これを行うために、私は安全に共有された単語頻度データ構造と各文字ストリームを読み、共有コレクションを更新するためのスレッドを持っています。すべてのスレッドが完了したら、データ構造をクライアントアプリケーションに返します。C#スレッドプールからの暫定結果をクライアントアプリケーションにコールバックする最良の方法

クライアントアプリケーションでは、結合された単語の中間結果が10秒ごとに必要です。これを行うには、デリゲートを使用して、すべてのワーカースレッドが完了するまで結果をクライアントに10秒ごとにコールバックします。その後、クライアントに最終結果を返します。

私の問題は、中間結果でクライアントをコールバックするときに共有データ構造をロックし、クライアントアプリケーションがコールバックから戻ってロックを解除できるようにするまで待つことです。コールバックが実行されている間、すべてのワーカースレッドはブロックされ、データ構造のロックを待機します。これは、賢明なもののように見えません。なぜなら、クライアントコードを即座に、あるいはまったく返すことに頼るべきではないと思うからです。しかし、私はクライアントコードに依存しない、それをやっていると考えることができる他の方法は、私のデータ構造のコピーやスナップショットを作成し、それをコールバックを介してクライアントに渡すことです。これはメモリと計算を犠牲にしていますが、コピーが作成されると、ワーカーは共有コレクションの更新を継続でき、コールバックは必要なものを何でも実行できます。

1)労働者をブロックするために、悪いクライアントコールバックの実装の可能性を可能、または定期的に高価な操作を行って、2つの悪の小さい方です:

は、私の質問は2倍です。

2)上記のいずれにも該当しないこの問題を解決する方法はありますか?

答えて

2

私は間違いなく2つの悪のうち大きい方がクライアントを信頼していると言います。ロックを保持している間に未知のコードにコールバックすると、デッドロックや悪化するシナリオのレシピになります。はい、オーバーヘッドを支払って構造のスナップショットを取得し、それを返すことになります。しかし、スナップショットの余分なメモリは、ロックを保持している間に呼び出されるリスクを上回ります。

私はこれまで同様の状況に陥っており、スナップショットは問題にはなりませんでした。しかし、それを回避するにはいくつかの方法があります。特定の時間にスナップショットを作成する必要があるデータの量を減らす、クライアントと呼ぶ頻度を増やします。

これを回避する別の方法は、不変のデータ構造を使用することです。クライアントと話す準備ができたら、現在のバージョンを切り離してクライアントに渡します。バックグラウンドスレッドで新しいスレッドを作成できるようにします。

+0

お返事ありがとうございます。この練習の全体的なポイントは、quailityコードを書くことの原則を示すことであり、私はいつも早期の最適化がすべての悪の根源であると教えられていたので、スナップショットメソッドを使用します。 :) –

0

私は最近、ライブラリを書く際にこのような問題に遭遇しました。これはまったく同じではありませんでしたが、基本的な質問は同じでした。あなたのライブラリを使用するクライアントはどれくらい信頼できますか?あなたが特定のことをするためにクライアントに頼ることができれば、より良いパフォーマンスを得ることができるときはどうしますか?

最後に、2つのコードパスと、クライアントがオブジェクトに設定してどのパスを使用するかを示すフラグを設定しました。本質的に、それは「あなたが私を信じることができる」という旗でした。設定されていない場合(デフォルト)、ライブラリは信頼できないクライアントを扱っていると想定し、クライアントに内部データ構造への直接参照を与えることはありません。しかし、クライアントがそのフラグを設定していれば、実際の構造に直接アクセスでき、私たちが設定したルールに従わなければなりませんでした(フラグとアクセサの両方に記録されています)。

しかし、あなたのケース(イベント)では、2つの異なるイベント、つまり別の選択肢があるように聞こえます。 「通常の」もの(クライアントに渡す前に構造をクローンする)と、ロックを保持し、実際の構造を調べる「先進的なもの」です。高度なイベントハンドラを使用する場合は、イベントハンドラ以外ではその参照を使用できないことを明確に文書化されていることを確認してください。

+0

あなたの答えをありがとう。私は速い版と安全な版の間で選択するという考えが好きですが、私の図書館は誰にも使われないような練習に過ぎないので、私はそれを簡単かつ安全に保つつもりです。 –

関連する問題