0

ここで不変のコレクションを暴こうとしています。ImmutableHashSet<Subscription>私の攻撃のポイントは、サブスクリプションを管理する従来の pub-sub イベント ブローカーです。

サブスクライブ操作は次のようになります

var s = new Subscription(this, subscriber);
subscriptions = subscriptions.Add(s);

パブリッシュ操作は次のようになります

foreach (var s in subscriptions)
  s.Subscriber.OnNext(args);

subscriptionsただし、パブリッシュ操作が行われている間に誰かがサブスクライブし、変数が置き換えられると仮定してみましょう。foreachループは正しく機能するでしょうか、それとも完全に壊れているでしょうか? (もしそうなら、これを修正するために何ができますか?) ありがとう。

4

1 に答える 1

6

subscriptions変数は、ループの開始時にのみ読み取られます。foreachコードを次のようなものに変換していることを思い出してください。

using (var iterator = subscriptions.GetEnumerator())
{
    while (iterator.MoveNext())
    {
        var s = iterator.Current;
        s.Subscriber.OnNext(args);
    }
}

したがって、基本的に、subscriptions呼び出した後に変数の値を変更してGetEnumerator()も、残りの動作にはまったく影響しません。次回にのみ影響します。(関連するメモリバリアが整っていると仮定するなど)

于 2013-07-20T20:11:05.093 に答える