1

私は非常に具体的なシナリオを持っています:

  1. いくつかの (マルチコアではなくメニーコア) TPL タスク (長時間実行されるため、スレッドである可能性が高い) は、データのコレクション (IDictionary など) を並列/オーバーラップする方法で読み取りたいと考えています。
  2. 1 つの Writer スレッドが定期的にコレクション全体を更新したい
  3. リーダーのレイテンシーを最小限に抑えることが第 1 の目標ですが、それが少し古いコレクションを取得することを意味する場合でも (つまり、コレクションの更新が進行中です)。
  4. リーダーはコレクション全体を取得する必要があります。部分的に更新されたコレクションは無効です

当初の考えでは、(4) 更新が発生するたびに新しいコレクションが作成され、一度作成されるとライター スレッドがリーダーに与えられたコレクション参照を単純に変更する可能性があることを回避することでした。これはアトミック操作であり、古い参照を持つリーダーは影響を受けず、新しいリーダーは新しい完全なコレクションにアクセスできるという暗黙の前提があります。

試してみると部分的に更新されたコレクションが得られるので、先に進む前にこのアプローチが機能するかどうかを知る必要があります...

4

1 に答える 1

0

投稿してからしばらく経ちましたが、IIRC は古いコレクションをコンストラクターのパラメーターとして使用して新しいコレクションを作成していました。つまり、浅いコピーです。

要素の適切なコピーを作成し、それらを使用して新しいコンテナーをインスタンス化することで、「ティアリング」を防ぐために必要なデータ項目を切り離すことができました。

于 2013-12-24T12:53:12.847 に答える