Pour lire une variable partagee entre plusieurs threads, il faut d'abord
qu'elle soit en memoire et pas assignee a un registre. Et la, il n'y a
jamais de probleme en C ou en C++: les API des threads et les regles de ces
langages sont telles que si la variable est accessible par plusieurs
threads, elle doit se trouver en memoire.
Il faut aussi que les acces a ces variables soient entourees par les
instructions de barrieres memoires pertinentes. Pas tellement de secret,
soit le compilateur les ajoute tout seul (seul cas potentiel que je
connaisse pour le C et le C++: utilisation de volatile sous Windows avec
les compilateurs de MS d'apres ce que j'ai compris; et encore je me demande
si le document que j'ai lu ne decrit pas l'intention de MS pour les
compilateurs futurs plus que la situation actuelle), soit on les mets
explicitements (par des fonctions intrinseques, par l'utilisation de
l'assembleur ou par effet de bord des fonctions de synchronisation de
l'OS). Si on ne le fait pas, le processeur peut se mettre a faire
des optimisations qui font qu'on accede pas aux bonnes valeurs ou pas dans
le bon ordre.
Finalement, il faut que le compilateur n'optimise pas de telle
maniere que les precautions precedentes soient inutiles (que ce soit en
reorganisant le code, en conservant dans des registres ou dans l'autres
zones de la memoire des resultats qui devraient etre recalcules). Donc le
compilateur doit etre place en mode multi-thread.
volatile (en C et en C++ et hors compilos MS; en Java c'est different) ne
sert a rien dans tout ceci pour du multithread. Plus precisement, il
resoud uniquement le dernier point et de maniere moins efficace que
necessaire. volatile a ete concu pour l'acces a des IO mappees en memoire
-- donc pour des drivers -- et n'est pas utile en dehors (voir par exemple
les messages de John Mashey sur le sujet sur comp.arch).