はx
とy
ある整数は、このコードを、考えてみましょうか?このコンパイラ変換は許可されていますか?</p> <pre><code>if (x) y = 42; </code></pre> <p>次のコンパイラ変換許可されている:
int tmp = y;
y = 42;
if (!x)
y = tmp;
コンテキスト:
これはビャーネ・ストロヴストルップのよくある質問からです:
// start with x==0 and y==0
if (x) y = 1; // Thread 1
if (y) x = 1; // Thread 2
よくある質問の状態これが無料のデータ競合です。 x
とy
が両方とも0の場合、いずれの値も書き込まれません。
しかし、変換が許可されていればどうなりますか?
はい(もちろん、もちろん 'tmp'という名前は使用できません)。しかし、なぜあなたは気にしますか? –
@BaummitAugen本当に? 'y'が他のスレッドからアクセスできる場合、変換は潜在的にデータ競合を招く可能性があります。 – hvd
@hvd他のスレッドは 'x'や' y'にアクセスすることはできません。それは既にUBになるでしょう。明示するには:新しいレースはないか、コードは以前には壊れていたでしょう。 ( 'x'が' std :: atomic 'でない限り、Qはそれを言っていません) –