Pourquoi est-volatils pas jugé utile multithread programmation C ou C++?

Comme l'a démontré cette réponse j'ai posté, j'ai l'impression d'être confus au sujet de l'utilité (ou l'absence) de volatile en multi-thread contexte de programmation.

Ma compréhension est ceci: toutes les fois qu'une variable peut être modifiée à l'extérieur du flux de contrôle d'un morceau de code en y accédant, cette variable doit être déclarée volatile. Les gestionnaires de signaux I/O registres, et les variables modifiées par un autre thread constituent de telles situations.

Donc, si vous avez un mondial int foo, et foo est lu par un thread et de définir automatiquement par un autre thread (probablement à l'aide d'une instruction machine), le thread de lecture, voit dans cette situation de la même manière, il voit une variable tordu par un gestionnaire de signal ou modifié par un matériel externe condition et, par conséquent foo doit être déclarée volatile (ou, pour le multithread situations, accessible avec la mémoire clôturé la charge, ce qui est probablement une meilleure solution).

Comment et où ai-je tort?

  • Tous les volatiles n'est dire que le compilateur ne doit pas mettre en cache l'accès à une variable volatile. Il ne dit rien sur serialising un tel accès. Cela a été discuté ici, je ne sais pas combien de fois, et je ne pense pas que cette question va rien ajouter à ces discussions.
  • Et encore une fois, une question qui ne le mérite pas, et il a été demandé à de nombreuses reprises avant de obtient upvoted. Vous s'il vous plaît arrêter de faire cela.
  • J'ai cherché d'autres questions, et trouvé un, mais tout existant explication que j'ai vu en quelque sorte de ne pas déclencher ce dont j'avais besoin pour vraiment comprendre pourquoi j'ai eu tort. Cette question a suscité une telle réponse.
  • Pour une grande étude en profondeur sur ce que les Processeurs faire avec des données (par l'intermédiaire de leurs caches) départ: rdrop.com/users/paulmck/scalability/paper/whymb.2010.06.07c.pdf
  • En Java volatile crée une barrière de mémoire lorsqu'il est lu, de sorte qu'il peut être utilisé comme un des threads du pavillon qu'une méthode est terminée depuis qu'il applique un passe-avant relation avec le code avant que le drapeau a été défini. Ce n'est pas le cas en C.
  • Java volatile n'a rien à voir avec le C/C++ volatile: Java volatile est définie à l'intérieur du modèle de langage, peut être transformé, optimisé (écrire suivie par la lecture de Java volatiles peuvent être optimisés pour écrire) et de la volatilité complètement éliminé si la volatilité de la variable est prouvable pas partagées entre les threads. En C/C++ volatile est à l'extérieur du modèle de langage, les opérations à la volatilité des objets peuvent avoir des effets visible pour les autres appareils, par définition, pas de transformation de la volatilité est possible, pas même une lecture dont le résultat est ignoré peut être éliminé. Ils n'ont pas le même but.
  • C'est ce que je voulais dire par "pas le cas en C", où il peut être utilisé pour écrire dans les registres de matériel, etc., et n'est pas utilisé pour le multithreading, comme il est couramment utilisé dans Java.