質問: head; ``` 両方の行が`head`の値を変更しない場合、両方の行は`head`の値を`snapshot`割り当てます。なぜ、最初のものが2番目に選ばれたのですか? **編集:**私が参照しているコードはここにあります: https : //github.com/SamSaffron/dapper-dot-net/blob/77227781c562e65c167bf7a933d69291d5bdc6f3/Dapper/SqlMapper.cs
回答: 彼らは揮発性の読み込みを行いたいが、汎用型のパラメータを取る`Thread.VolatileRead`のオーバーロードはない。この方法で`Interlocked.CompareExchange`を使用すると、同じ結果が得られます。 彼らが解決しようとしている問題は、JITコンパイラが、適切と見なされると、一時的な割り当てを最適化できるということです。現在のスレッドが一連の操作でそれを使用している間に、別のスレッドがヘッド参照を変更すると、スレッドの問題が発生する可能性があります。 編集: 問題は、 `TryAdd`開始時に古い値が読み取られるということではありません。問題は105行目で、現在のヘッドを前のヘッド( `snapshot` )と比較する必要があることです。最適化が存在する場合、以前の値を保持する`snapshot`変数がなく、その時点で`head`が再び読み取られます。 headが103行と105行の間で変更された可能性がありますが、 `CompareExchange`成功する可能性が非常に高いです。その結果、2つのスレッドが`TryAdd`同時に呼び出すと、リスト内のノードが失われます。