dans un seul programme de fil, comment sont les modifications apportées par filetage dans le noyau 1 rendu visible à l'autre du noyau 2, de sorte qu'après un changement de contexte du fil (maintenant en cours d'exécution sur le noyau 2) aura une valeur mise à jour?visibilité des données sur le processeur à plusieurs noyaux par fil unique
Prenons l'exemple suivant:
La valeur dans la mémoire principale pour la variable
x
est 10.Le fil passe sur le noyau 1 et les changements
x
à 5, qui est toujours dans la mémoire cache et pas encore vidé à la mémoire principale car nous n'utilisons aucune barrière de mémoire.Un interrupteur contexte se produit et le fil se déplace de noyau 1 à noyau 2.
Le fil lit la valeur du
x
.
Quelle serait la valeur de x
si fil reprend l'exécution dans le noyau 2 après le changement de contexte? Si la «cohérence du cache» gère la cohérence pour gérer un cas comme ci-dessus, pourquoi avons-nous besoin d'un verrouillage explicite (ou d'une barrière de lecture/écriture) dans un programme multithread?
J'avais d'abord manqué que les valeurs des registres sont copiées pendant le changement de contexte. Les liens suivants l'illustrent bien. http://stackoverflow.com/questions/3920284/how-are-registers-shared-among-threads http://stackoverflow.com/questions/10371842/how-each-thread-can-have-cpu-registers https://www.quora.com/Do-the-threads-within-a-process-have-their-own-registers-but-use-the-same-code-global-data-and-stack – javaq