スレッド競合とデータ競合に違いはありますか?マルチスレッド:スレッド間の競合操作とデータ競合
2つのスレッドが同じメモリ位置にアクセスしようとしたときに矛盾する操作が発生し、そのうちの少なくとも1つが書き込み操作であるということを、
Hereは、データ競争/競争状態についてウィキペディアが何を言いますか。
どう違うのですか?
スレッド競合とデータ競合に違いはありますか?マルチスレッド:スレッド間の競合操作とデータ競合
2つのスレッドが同じメモリ位置にアクセスしようとしたときに矛盾する操作が発生し、そのうちの少なくとも1つが書き込み操作であるということを、
Hereは、データ競争/競争状態についてウィキペディアが何を言いますか。
どう違うのですか?
私はついにこの質問に良い答えを見つけました。
TL:DR: -
競合操作 -
データ競合 - 順序なし競合する操作。
LONG VERSION -
私はどのように競合操作が発生例で説明していますし、それらがどのようにレースのないデータである場合に識別します。
Thread 1
とThread 2
と共有変数done
を考えてください。
AtomicBoolean done = new AtomicBoolean(false);
int x = 0;
Thread 1
x = f();
done.set(true);
Thread 2
while(!done.get())
{
/* a block */
}
y = g(x);
ここdone.set() - done.get()
とx=f() - y=g(x)
は対立しています。しかし、プログラミングメモリモデルは、 - synchronizes-with
とhappens-before
の2つの関係を定義しています。 done
はアトミックなので、そのペアの操作は互いに同期します。さらに、そのために、そのペア内の他のオペレーションhappens before
を選択することができます。 x = f()
は、スレッド1にdone.set(true)
前に発生し、done.get()
がスレッド2にy = g(x)
前に起こるので
x = f()
が
y = g(x)
前に起こると言うことができます。
このように、上記の例は順序付けされており、結果的にデータ競合が発生しません。