4

私は、多くの同時実行性を失うことなく、複数のスレッド間で共有されている情報やデータ構造への変更を公開するために人々が使用する手法に興味があります。私の個人的な経験では、単一のライター/複数のリーダーに頻繁に遭遇します。単一のスレッドがオブジェクトを更新していますが、複数のスレッドがオブジェクトから読み取りを行っているため、変更について通知する必要があります。

簡単な例として、ハッシュテーブルを考えてみましょう(粗粒度のロック、細粒度のロック、または低ロックの手法など、スレッドセーフであると仮定しましょう)。スレッド1は、ハッシュテーブルへの情報の配置と削除を担当しますが、唯一のライターです。他のスレッドは、キーが変更されたとき、特定のキーが変更されたとき、または任意のバリアントのときに通知を受けることを希望する場合があります。彼らが購読したいものは特に重要ではありません。

スレッドがタイムリーで正しい変更情報を確実に受け取るために、どのような手法(論文の提案が欲しい)を使用しますか?

4

2 に答える 2

1

これを行う従来の方法は待機条件を使用することですが、イベントが到着するまでスレッドをブロックします。

今日では、ワーカースレッドごとにメッセージキューを使用し、中央のデータ構造の更新は、ワーカースレッドのキューに投稿されたメッセージになります。これも内部で待機条件を使用しますが、これはネイキッド待機条件よりも高レベルのインターフェイスであり、ほぼすべてのプログラミング言語でこの種のプログラミングをライブラリで適切にサポートしています。

もう少しハックな解決策はselect()、通知スレッドがスリープ状態のスレッドをウェイクアップするためにバイトを書き込むソケットでの呼び出しでスレッドをブロックすることです。を使用select()すると、この種のイベントを他のほぼすべてのイベント処理と多重化できるという利点があります。そのため、ターゲットスレッドがGUIスレッドなどの場合にも適用できます。

于 2009-07-26T10:57:43.820 に答える
1

あなたは実際に2つの明確な問題について尋ねました

MultipleReader/SingleWriterの除外

更新通知(これはしばしばオブザーバーパターンと呼ばれます)

MultipleReader / SingleWriter Locksは、膨大な量の文献がある古典的な問題です。本当の問題は、古典的なソリューションの多くが複数のミューテックスやセマフォを含み、単純な書き込みロックごとに6つのリードモディファイライト(RMW)サイクル、最初の読み取りロックに6つのRMWを含む非常に重いものになる可能性があることです。

両方の問題にはかなりの数の解決策があり、その効率と実用性は、読み取りの到着率、書き込みの到着率、書き込みの期間、読み取りの期間、更新をバッチ処理できるかどうかに依存します。アップグレードする必要がありますか読み取りロック、書き込みロックのダウングレード(あなたの場合はnoのように聞こえます)

ハッシュテーブルの例では、「O(スレッドにアクセスするn)である中程度の粒度のロックを使用して、ハッシュテーブルのチャンクにロックを任意に割り当てることができます(個別のチェーンに注意してください。オープンアドレス法では、ロックは必ずしもロックされません。スロットにプローブされます)。または、同時ハッシュテーブルアルゴリズムをハッシュするホップスコッチを使用することもできます。

通知に関する限り、いくつかの典型的な質問は次のとおりです。

すべての読み取りスレッドは、すべての通知を参照(および処理)する必要がありますか?オブザーバーのセットは静的ですか、それとも動的ですか?つまり、通知「ネットワーク」を静的にすることができます(コンパイル時の定義)

于 2009-07-27T20:40:22.793 に答える