web-dev-qa-db-fra.com

le mot-clé volatile en langage C?

J'ai une question sur volatile en langage C.

J'ai lu un didacticiel mais je n'arrive toujours pas à comprendre, certains disent que le volatile indique à l'optimiseur de complicateur que les opérations impliquant cette variable ne doivent pas être optimisées de certaines manières. cela signifie que chaque fois que la valeur d'une variable est modifiée dans le registre, la valeur doit affecter la mémoire.

Et aussi certains disent que volatile signifie que la valeur peut être modifiée par des moyens en dehors de ce code.

Je ne peux pas comprendre le deuxième dicton, de sorte que la variable volatile peut être modifiée par des moyens en dehors de ce code? Comment? et ces deux-là disent-ils tous les deux?

29
user707549

L'instruction "la valeur peut être modifiée par des moyens en dehors de ce code" signifie essentiellement qu'un autre programme ou matériel peut mettre à jour cette variable. C'est tout à fait possible. Une façon de penser est de relier ce concept à un fichier partagé entre plusieurs programmes. Un fichier peut être ouvert, écrit et lu par de nombreux programmes à la fois. Lorsque vous lisez un fichier, vous voulez vous assurer que vous lisez la dernière mise à jour et non la plus ancienne.

Revenir au mot-clé volatile, placer volatile avant une variable, en fait, fait la même chose. Il s'assure que ce que vous lisez de la variable n'est pas basé sur l'optimisation du compilateur ou une ancienne copie de la variable que votre programme avait. De plus, le mot-clé volatile garantit que la variable est extraite de la mémoire à chaque accès. Par conséquent, ces deux déclarations sont correctes concernant le mot clé volatile.

41
WindsurferOak

C n'est pas nécessairement pour les ordinateurs. Par exemple, si vous développez pour Game Boy Advance, vous tombez souvent sur des emplacements de mémoire modifiés par le matériel, donc vous ne pouvez pas modifier la variable dans votre code, mais il est quand même modifié. C'est ce que volatile signifie.

En ajoutant le mot clé volatile, vous indiquez au compilateur que "La valeur stockée dans cette variable (emplacement de la mémoire) peut changer sans le code my faire quoi que ce soit. "

19
aviraldg

Tenez compte de l'un des éléments suivants:

  • une application multi-thread,
  • une application utilisant la mémoire partagée,
  • une application s'exécutant sur une plateforme qui mappe les registres d'E/S dans l'espace d'adressage,
  • une application avec du matériel DMA apparaissant en arrière-plan.

Dans chacune de ces situations, la mémoire peut être modifiée en dehors du thread actuel.

Notez que "chaque fois que la valeur d'une variable est modifiée dans le registre, alors la valeur devrait affecter la mémoire" est correcte, mais pas très claire.

15

Un emplacement mémoire peut être modifié en dehors d'un code de programme de nombreuses manières. Par exemple, une lecture DMA à partir d'un disque peut écrire dans un tampon, ou un périphérique mappé en mémoire peut modifier un emplacement en raison d'un événement sur le périphérique.

5
Neil Butterworth

cela concerne, par exemple, les applications multithreads: la valeur d'une variable peut être modifiée par plusieurs threads et doit donc être "synchronisée" avec la mémoire à chaque accès (qu'il s'agisse de lire ou d'écrire la valeur).

3
Flinsch

Déclarer une variable volatile signifie que vous demandez au compilateur de ne pas optimiser l'extrait de code autour de cette variable. C'est pour forcer le cpu à NE PAS utiliser la valeur variable des registres locaux ou de la mémoire cache mais à récupérer la valeur de la mémoire principale à chaque fois.

1
user2212525