1
float myTotalAmount=0; 
void update(float amt){ 
    myTotalAmount+= amt; 
} 

tâche A appel update(10);Comment le changement de contexte peut-il affecter la modification d'une variable?

tâche B Appel update(5);

Comment peut conditionner la course affecter le résultat de myTotalAmount?

Tâche B peut appeler la méthode de mise à jour car changement de contexte est arrivé pour une raison quelconque avant Tâche A terminé?

Sur tout ce que j'essaie de comprendre race condition.

+0

Je vote pour fermer cette question hors-sujet, car elle appartient à cs.stackexchange.com –

Répondre

1

int myTotalAmount = 0

Groupe A

Updata(10);

Groupe B

Updata(5)


myTotalAmount+= amt; n'est pas une opération atomique. Dans le sens où cette ligne sera traduite en plusieurs commandes machine.

Cela dit, la tâche A sauveront la valeur de myTotalAmount dans un registre, cette valeur sera 0. Si un changement de contexte happends maintenant et Task B commence à courir, il modifiera myTotalAmount être 5. Maintenant, le système d'exploitation décide de exécutez à nouveau Task A. Même si la valeur de myTotalAmount est maintenant 5, nous en avons déjà extrait la valeur et l'avons enregistrée dans un registre et elle était 0. L'exécution de continuera à partir de ce point où myTotalAmount était 0. Maintenant myTotalAmount sera affecté 0+10 et ce sera 10 au lieu de 15.

Pour résoudre ce problème, vous pouvez déployer une certaine synchronisation afin d'éviter les conditions de concurrence. Vous pouvez utiliser le verrou.