2016-10-06 27 views
0

スレッド競合とデータ競合に違いはありますか?マルチスレッド:スレッド間の競合操作とデータ競合

2つのスレッドが同じメモリ位置にアクセスしようとしたときに矛盾する操作が発生し、そのうちの少なくとも1つが書き込み操作であるということを、

Hereは、データ競争/競争状態についてウィキペディアが何を言いますか。

どう違うのですか?

答えて

1

私はついにこの質問に良い答えを見つけました。

TL:DR: -

競合操作 -

  • は、それらの同じメモリ位置
  • にアクセスする少なくとも一つは、書き込み動作で複数のスレッド
  • を含みます。

データ競合 - 順序なし競合する操作。

LONG VERSION -

私はどのように競合操作が発生例で説明していますし、それらがどのようにレースのないデータである場合に識別します。

Thread 1Thread 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-withhappens-beforeの2つの関係を定義しています。 doneはアトミックなので、そのペアの操作は互いに同期します。さらに、そのために、そのペア内の他のオペレーションhappens beforeを選択することができます。 x = f()は、スレッド1にdone.set(true)前に発生し、done.get()がスレッド2にy = g(x)前に起こるので

は今、私たちは前に起こる推移関係であるため、 x = f()y = g(x)前に起こると言うことができます。

このように、上記の例は順序付けされており、結果的にデータ競合が発生しません。