いくつかのスレッドから次のコードを呼び出す必要があります。ロックステートメントを使用せずにコードをスレッドに安全にする
// x is a global/member and initialized to 0
if (Interlocked.Increment(ref x) == 2)
{
// do something only once
}
このコースのスレッドセーフではありません:x
を実行時に最初のスレッドがx
がインクリメントされた後に停止したが、評価の前にされた場合、次いで第2のスレッドの増分はそれが今2で、その後、if
声明true
です。それから、最初のスレッドに戻り、if
ステートメントでもtrueになります。
これは、コードをlock
ステートメントで囲むことで修正できます。
lock
ステートメントを使用せずにスレッドを安全にする方法はありますか?
'Interlocked.Increment()'メソッドの戻り値が他のスレッドによって変更できないため、上記のシナリオは発生しません。 – dymanoid
あなたのコードは後に 'x'に再びアクセスし、インクリメントの結果と同じであると仮定しても安全ではないかもしれませんが、ここにこの問題を示すコードは表示されていません。 –