この質問をできるだけ一般的なものにしようとしますが、実際の問題を簡単に紹介します-
プライオリティ キューに同時スキップリストを実装しようとしています。各「ノード」には、値と「転送」ノードの配列があります。ここで、node.forward[i] はスキップリストの i 番目のレベルの次のノードを表します。書き込みアクセス (つまり、挿入と削除) には、スピンロックを使用します (使用するのに最適なロックかどうかを判断するためです)。
私の質問は基本的に、トラバーサルに読み取りアクセスが必要な場合です。
node = node.forward[i]
このような状況では、どのようなスレッド セーフが必要ですか? 別のスレッドが node.forward[i] を読み取りとまったく同時に変更している場合 (読み取り用の現在のロック メカニズムがない場合)、ここで何が起こる可能性がありますか?
私が最初に考えたのは、Forward のインデクサーの getter と setter に ReaderWriterLockSLim を配置することです。このシナリオでは、不必要なロックが多すぎますか?
編集:または、代わりにすべての読み取りに Interlocked.Exchange を使用するのが最善でしょうか?