volatile est traduit par le copilateur par : ne mets jamais cette variable en registre.
En effet, le processeur charge des variables dans ses registres pour un traîtement plus rapide, mais quand il y a un changement de thread, ces registes sont sauvegardés (pour être restaurés quand le thread est réactivé) sans checher à remettre les variables dans leurs emplacements mémoire qui leur appartiennent.
Il se peut donc que la version la plus à jour d'une variable soit dans un registre, et que je changement de tâche active un autre thread qui veut toucher à la variable. Celui-ci voit donc une variable non à jour, et de toute manière, qd le premier thread sera activé, celui là risque bien d'écraser la varible en mémoire par la valeur qu'il avait en registre.
Pour palier à ceci, un volatile évitera le passage en registre.
Mais il faut savoir que le volatile empêche l'optimisation de la variable, aussi ce n'est pas sérieux de mettre un compteur de boucle interne en volatile (ou autres conneries de ce genre).
Enfin, quand on a un prog qui ne bugge pas en debug, mais qui plante en version optimisée ou release, l'absence de volatile est une cause possible de plantage. C'est chiant car c'est un problème que l'on ne peut pas voir avec le débuggueur.
---------------
-----------------------