投稿者 YuO  (社会人) 投稿日時 2017/6/11 00:02:56
現実的な話としては,Integer型のフィールドの代入において,Interlockedクラスの各メソッドを使う必要はありません。
Long型は64bitプロセスならばやはり不要です。

で,Interlocked.Exchangeに関しては,件のページの記述だけだと不十分です。

「Interlockedであること」を無視するならば,Interlocked.Exchangeは以下のような動作になります。
Public Shared Function Exchange (ByRef location1 As Integer, value As IntegerAs Integer
    Dim result = location1 '※1 
    location1 = value '※2 
    Return result
End Funciton


このコードだと※1と※2の間に別のコードがlocation1を書き換える可能性があります。
そうすると,上記のExchangeの戻り値は「valueを設定する直前のlocation1の値」ではなくなってしまいます。
そうでないことを防いでくれるのが,Interlocked.Exchangeになります。

これを使うと何ができるかというと,「フラグが立っていなければフラグを立てて作業する」というようなことができます。
# see) MSDN https://msdn.microsoft.com/ja-jp/library/d3fxt78a(v=vs.110).aspx
ただ,InterlockedのExchangeよりはCompareExchangeの方が,この目的には使えてしまったりしますが……。


ちなみに,スレッド間でアクセスの競合が起きても各種例外は発生しません。
さらに,競合が起きたことを認識する方法も基本的にはありません (起きた後にデータ不整合を検知できればわかる)。
なので,競合を起こさないようにプログラムを作る必用があります。