Est-ce que" data races "et" race condition " sont en fait la même chose dans le contexte de la programmation concurrente

je trouve souvent ces termes utilisés dans le contexte de la programmation concurrente . Sont-ils de la même chose ou différents ?

61
demandé sur tgogos 2012-06-30 21:44:25

4 réponses

non, ce n'est pas la même chose. Ils ne sont pas un sous-ensemble des uns des autres. Ils ne sont ni nécessaires, ni suffisants les uns pour les autres.

la définition d'une course de données est assez claire, et donc, sa découverte peut être automatisée. Une course de données se produit quand 2 instructions de différents threads accéder au même emplacement de mémoire, au moins un de ces accès est une écriture et il n'y a pas de synchronisation qui mandate tout ordre particulier parmi ces accès.

une condition de course est une erreur sémantique. C'est un défaut qui se produit dans le timing ou l'ordre des événements qui conduit au comportement de programme erroné. De nombreuses conditions de course peuvent être causées par des courses de données, mais ce n'est pas nécessaire.

considérons l'exemple simple suivant où x est une variable partagée:

Thread 1    Thread 2

 lock(l)     lock(l)
 x=1         x=2
 unlock(l)   unlock(l)

dans cet exemple, les Écritures À x à partir du thread 1 et 2 sont protégés par des serrures, c'est pourquoi ils se produisent toujours dans quelque ordre imposé par l'ordre avec lequel les serrures sont acquises à l'Heure de fonctionnement. C'est-à-dire que l'atomicité de l'écriture ne peut pas être brisée; il y a toujours un événement avant la relation entre les deux écritures dans toute exécution. Nous ne pouvons pas savoir quelle Écriture se produit avant l'autre a priori.

il n'y a pas d'ordre fixe entre les Écritures, parce que les serrures ne peuvent pas fournir cela. Si l'exactitude des programmes est compromise, dites quand l'écriture à x par le thread 2 est suivie par l'écriture à x dans le thread 1, nous disons qu'il y a une condition de course, bien que techniquement il n'y ait pas de course de données.

il est beaucoup plus utile de détecter les conditions de course que les courses de données, mais cela est aussi très difficile à réaliser.

la construction de l'exemple inverse est également triviale. Ce post de blog qui explique aussi la différence très bien, avec une simple opération bancaire par exemple.

88
répondu Baris Kasikci 2014-10-16 20:59:51

selon Wikipedia, le terme "condition de race" est utilisé depuis l'époque des premières portes de la logique électronique. Dans le contexte de Java, une condition de course peut concerner n'importe quelle ressource, comme un fichier, une connexion réseau, un thread d'un pool de threads, etc.

le terme" Course de données "est le mieux réservé à son sens spécifique défini par le JLS .

le cas le plus intéressant est une condition de race qui est très semblable à une course de données, mais ne l'est toujours pas, comme dans cet exemple simple:

class Race {
  static volatile int i;
  static int uniqueInt() { return i++; }
}

étant donné que i est volatile, il n'y a pas de course de données; cependant, du point de vue de la justesse du programme , il y a une condition de course due à la non-atomicité des deux opérations: lire i , écrire i+1 . Plusieurs threads peuvent recevoir la même valeur de uniqueInt .

17
répondu Marko Topolnik 2013-09-22 19:32:59

pour moi courses de données est un sous-ensemble de tous conditions de course . Les courses de données se produisent quand deux ou plusieurs threads accèdent à la même mémoire sans verrouillage approprié qui peut conduire à des valeurs inattendues (si vous avez au moins un thread faisant écrit).

le terme de condition de course en général pourrait également se référer, par exemple, à des threads qui se bloquent occasionnellement en raison de courses dans la programmation de threads (et à l'utilisation de mécanismes de verrouillage inproper).

5
répondu johlo 2012-06-30 17:58:31

non, ils sont différents et aucun d'eux n'est un sous-ensemble d'un ou vice-versa.

le terme race condition est souvent confondu avec les données connexes terme race, qui se produit lorsque la synchronisation n'est pas utilisé pour coordonner tous les accès à un champ Non final partagé. Vous risquez une course de données chaque fois qu'un thread écrit une variable qui pourrait être lue par un autre thread ou lit une variable qui peut avoir été écrit par un autre thread si les deux threads n'utilisent pas la synchronisation, le code avec les courses de données a aucune sémantique définie utile sous le modèle de mémoire Java. Pas tous la course les conditions sont des courses de données, et toutes les courses de données ne sont pas des conditions de course, mais ils peuvent tous les deux causer l'échec de programmes concurrents dans imprévisible façon.

tiré de L'excellent livre - Java Competiency in Practice by Joshua Bloch & Co.

2
répondu Shirgill Farhan Ansari 2017-12-04 13:26:22