Une "race condition" quand multithread (ou parallèle) le code d'accès à une ressource partagée pourrait le faire de façon à provoquer des résultats inattendus.
Prenez cet exemple:
for ( int i = 0; i < 10000000; i++ )
{
x = x + 1;
}
Si vous aviez 5 threads s'exécutant ce code à la fois, la valeur de x ne SERAIT PAS finir par être de 50 000 000. Il serait, en effet, varier avec chaque exécution.
C'est parce que, pour chaque thread pour incrémenter la valeur de x, ils doivent faire ce qui suit: (simplifié, évidemment)
Récupérer la valeur de x
Ajouter 1 à la valeur de cette
Stocker cette valeur de x
Un filet peut être à n'importe quelle étape de ce processus à tout moment, et ils peuvent les uns les autres quand une ressource partagée est impliqué. L'état de x peut être changé par un autre thread, durant le temps entre x est en cours de lecture et, lorsqu'elle est écrite en arrière.
Disons un thread récupère la valeur de x, mais n'a pas encore stocké encore. Un autre thread peut également récupérer la même valeur de x (car pas de fil a changé encore) et puis ils seraient tous les deux le stockage de la même valeur (x+1) x!
Exemple:
Thread 1: lit x, la valeur est de 7
Thread 1: ajouter 1 à x, la valeur est maintenant de 8
Filetage 2: lit x, la valeur est de 7
Thread 1: les magasins 8 à x
Filetage 2: ajoute 1 à x, la valeur est maintenant de 8
Filetage 2: magasins 8 x
Des conditions de course peut être évité en utilisant une sorte de verrouillage mécanisme avant le code qui accède à la ressource partagée:
for ( int i = 0; i < 10000000; i++ )
{
//lock x
x = x + 1;
//unlock x
}
Ici, la réponse vient comme 50 000 000 de tous les temps.
Pour en savoir plus sur le verrouillage, de recherche pour: mutex, sémaphore, section critique, ressource partagée.