xが共有スレッド間変数であり、funcが常に0を返すと仮定すると、以下のコードにはC11とC++ 11のデータ競合が含まれていますか? xは、以下のswitch文を除いて、常に適切なロックを持つ2つの異なるスレッドで書かれているとします。共有変数への保護されていないアクセスは常にデータ競合ですか?
int x; // global variable
...
int y; // local variable
...
switch (func())
{
case 1:
{
x = 0;
y = 1;
break;
}
case 2:
{
x = 0;
y = 2;
break;
}
case 3:
default:
{
y = 3;
break;
}
}
標準には(C11とC++ 11の両方)、コードにデータ競合を導入するコンパイラの変換を防ぐメモがあります。コンパイラは以下のようなコードを変換できますか?以下のコードは確かにデータ競合を含んでいますが、コンパイラがそれを導入したのか、それとも既に元のコードであったのかという疑問があります。共有変数にはアクセスできないが、保護されていないアクセスがありました。 C++標準で
int x; // global variable
...
int y; // local variable
...
temp = x;
x = 0;
switch (func())
{
case 1:
{
y = 1;
break;
}
case 2:
{
y = 2;
break;
}
case 3:
default:
{
x = temp;
y = 3;
break;
}
}
のデフォルトセクション内の任意の同期メカニズムは、データレースを期待していなければ、そうあなたは、むしろ 'のstd ::原子 Xを持つ必要があります;' –
はい、絶対に –
それだけではありません。データ競合Cはコンカレントプロセスのコンセプトを持っていません – Olaf