Supponendo che x sia una variabile inter-thread condivisa e func restituisca sempre 0, il codice seguente contiene una corsa di dati in termini di C11 e C++ 11? Si supponga che x sia scritto in due thread diversi, sempre con un lock appropriato, tranne l'istruzione switch qui sotto.L'accesso non protetto alla variabile condivisa è sempre una corsa di dati?
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;
}
}
c'è una nota nella norma (sia C11 e C++ 11) che preclude trasformazioni compilatore che introduce una gara di dati al codice. Il compilatore è autorizzato a trasformare il codice come di seguito? Il codice qui sotto contiene certamente una corsa di dati, ma la domanda è se il compilatore l'ha introdotta o se era già nel codice originale. C'era un accesso non protetto a una variabile condivisa, sebbene irraggiungibile.
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;
}
}
senza meccanismi di sincronizzazione si aspettano gare di dati, sì si dovrebbe piuttosto avere un 'std :: atomiche x;' –
Sì, assolutamente –
non è solo.. una corsa dati C non ha un concetto di processi concorrenti – Olaf