2017-03-29 6 views
1

私はここに、Memory ModelにBjarneのよくある質問を読んでいますが、C++ 11社の保証はそのような問題は、別々のメモリ位置」のために発生しないようにするために、引用なぜデータ競争がないのですか?

である 『』より正確には:メモリ位置が安全にアクセスすることはできません1つのワード内の異なるビットフィールドは別々のメモリ位置ではないので、何らかのロックなしでスレッド間でビットフィールドを持つ構造体を共有しないでください。 C++メモリモデルは単純に「誰もが期待している通り」である。

しかし、低レベルの並行性の問題については、まっすぐ考えるのは必ずしも容易ではない。検討:X == 0かつy == 0

開始する場合(X)、Y = 1。 //スレッド1

if(y)x = 1; //スレッド2

ここに問題がありますか?より正確には、データ競争はありますか? (いいえありません)。

私の質問は、なぜデータ競争ですか?スレッド1はyのライターであり、スレッド2はyのリーダーであり、同様にxのリーダーであるため、明らかにデータ競合があることは明らかです。

+0

(0,0)で始まるのはここのキーポイントです –

答えて

3

xy0であるため、ifの背後にあるコードは実行されませんし、何の書き込みは行われませんので、何のデータ競合はあり得ません。

+0

Bjarneの例のポイントは何ですか?私にはかなり些細なことだが、隠された問題があるかのように書く。 – zett42

+0

@ zett42私はそれを得る前に10回も読まなければならなかった。要点は、この非常に単純な例でさえ、人々を混乱させることができることです。多分あなたを混乱させるのは単純すぎるかもしれませんが、糸の安全性についての推論が難しいという一般的な点はまだありません。 – nwp

+0

「まっすぐ考えるのは必ずしも容易ではない」と書いたので、それは私を混乱させただけだった;-) – zett42

2

重要なポイントは次のとおりです。

開始x==0とし、それが起動時に両方の変数が0に設定されているのでy==0

ifテストが失敗し、割り当てが発生することはありません。したがって、両方のスレッドは変数を読み込み、書き込むことはありません。

関連する問題