Sommaire

Usage du mot-clé volatile

1. Mise en évidence du problème à résoudre

Dans une situation monothread, il n’y a pas d’effets de bord induits par le compilateur. En effet, le problème ici est clairement lié au fonctionnement du compilateur, sans incidence en monothread.

Un compilateur peut décider parfois de changer l’ordre des instructions dans le cadre d’optimisations qui lui sont propres. Le développeur n’a pas réellement la main sur cela a priori.

Ainsi, on définit ces deux variables.

private static int interrupteur = 0;  
private static bool valeur = false;

Puis, on définit ce thread :

public static void Thread1()  
{  
  interrupteur = 1;  
  valeur = true;  
}

Le compilateur pourra très bien décider de d’abord exécuter la ligne de l’interrupteur, mais peut très bien intervertir les instructions pour des raisons qui lui sont propres et commencer par la ligne relative à la valeur.

Selon si le thread numéro 1 commence par la ligne « interrupteur » ou « valeur » et selon également le moment auquel est lancé le thread numéro 2 qui suit (entre les deux lignes par exemple), alors le thread numéro 2 pourra renvoyer la valeur true (à l’affichage), mais également ne rien renvoyer du tout.

public static void Thread2()  
{  
  if (interrupteur == 1)  
  {  
   ...