2 つの同時辞書 (作成、更新、削除時) を更新する機能をサポートする必要があります。各操作 (更新、削除、作成) はそれらのうちの 2 つを使用し、アトミックである必要があります。.NET C# でこれを行う最善の方法は何ですか。
2 に答える
最も簡単な方法は、ロックを使用することです。
private object m_methodMonitor = new object();
private void Update()
{
lock (m_methodMonitor)
{
// Do whatever
}
}
private void Delete()
{
lock (m_methodMonitor)
{
// Do whatever
}
}
注意: 辞書の「書き込み」操作をロックするだけでは十分ではありません! また、更新メソッドの 1 つによって現在アクセスされているディクショナリから値を取得しようとする場合を回避するために、ディクショナリの読み取りを同期する必要があります。
ここでの課題は、両方の辞書をアトミックに変更する必要があるという要件です。このConcurrentDictionary<TKey,TValue>
クラスには、同じキーを共有するキーと値のペアの同時更新を可能にするためにインスタンスを「グループ化」することをサポートする組み込みメカニズムがありません。
その結果、操作で原子性を付与するために使用できる高スループットのメカニズムはありません。
オブジェクトのグループに対してアトミック操作を取得するためにできる唯一のことは、オブジェクトへのアクセスをロック メカニズムでラップすることです。
public void Update(...)
{
lock(this.dictionaryLock)
{
this.dictionaryA.AddOrUpdate(...);
this.dictionaryB.AddOrUpdate(...);
}
}
アプリケーションの一般的なパターン (たとえばReaderWriterLockSlim
、アプリケーションが頻繁に読み取り、頻繁に変更しない傾向がある場合は a を使用) に合わせて最適化すると、さまざまなロック メカニズムを使用してより良い結果が得られる可能性がありますが、ディクショナリ全体へのアクセスをシリアル化することしかできません。
同時実行パフォーマンスが非常に重要な場合は、2 つではなく 1 つの同時実行ディクショナリを使用するように設計をリファクタリングする必要があります。