En supposant que x est une variable inter-thread partagée et func renvoie toujours 0, le code ci-dessous contient-il une course de données en termes de C11 et C++ 11? Veuillez supposer que x est écrit dans deux threads différents, toujours avec un verrou approprié, sauf l'instruction switch ci-dessous.L'accès non protégé à une variable partagée est-il toujours une course de données?
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;
}
}
Il y a une note dans la norme (les deux C11 et 11 C++) qui empêche les transformations du compilateur qui introduit une course de données au code. Est-ce que le compilateur est autorisé à transformer le code comme ci-dessous? Le code ci-dessous contient certainement une course de données mais la question est de savoir si le compilateur l'a introduit ou s'il était déjà dans le code original. Il y avait un accès non protégé à une variable partagée, mais inaccessible.
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;
}
}
Sans mécanismes de synchronisation attendent des courses de données, oui, vous devriez plutôt avoir un 'std :: atomique x,' –
Oui, absolument –
Il est pas seulement.. une course de données C n'a pas de concept de processus concurrents – Olaf