Quand utiliser volatile avec le multi threading?

Si il y a deux fils de l'accès à une variable globale, puis de nombreux tutoriels dire que la variable volatile pour empêcher le compilateur de la mise en cache de la variable dans un registre et ainsi de ne pas obtenir mis à jour correctement.
Cependant les deux fils à la fois de l'accès à une variable partagée est quelque chose qui demande de protection par l'intermédiaire d'un mutex n'est-ce pas?
Mais dans ce cas, entre le fil de verrouillage et de libérer le mutex le code est dans une section critique où seulement qu'un thread peut accéder à la variable, auquel cas la variable n'a pas besoin d'être volatile?

Donc qu'est-ce que l'utilisation et le but de volatiles dans un programme multi-threadé?

  • Dans certains cas, vous ne voulez pas/besoin d'une protection par le mutex.
  • Parfois, c'est bien d'avoir une condition de concurrence, parfois il ne l'est pas. Comment êtes-vous à l'aide de cette variable?
  • Un exemple de cas où il est "amende" pour avoir une course de, s'il vous plaît?
  • Va ici. Imaginez que vous avez un thread de travail qui est le traitement d'un certain nombre de tâches. Le thread de travail incrémente un compteur à chaque fois qu'il termine une tâche. Le maître thread lit régulièrement ce compteur et les mises à jour de l'utilisateur avec des nouvelles de l'avancement. Tant que le compteur est bien aligné pour éviter de déchirer il n'est pas nécessaire de synchroniser les accès. Bien qu'il y a une course, c'est bénin.
  • Il serait difficile d'en évaluer la sécurité d'un tel dispositif sans un examen complet de la code. Même si un examen a conclu que les écritures ont été atomique (douteuse) et entièrement écrit-via le cache (difficile à dire), je serais encore à rejeter ce que les "mauvais code". C'est safetey serait extrêmement ténue, et facilement brisée par la plus petite des modifications au code. Maintennance les programmeurs de briser cet appareil facilement, et les problèmes qui n'apparaissent pas dans les tests.
  • Le matériel sur lequel l'exécution de ce code garantit que alignés variables ne peuvent souffrir de la déchirure. Si le travailleur est à la mise à jour de n à n+1 que le lecteur lit, le lecteur ne se soucie pas de savoir si ils obtiennent n ou n+1. Pas de décisions importantes vont être prises, car il est uniquement utilisé pour la production de rapports d'avancement.
  • Je suppose que je ne sais pas ce que tu veux dire par "la déchirure."
  • re déchirure, je vous offre la suite de Joe Duffy: msdn.microsoft.com/en-us/magazine/cc817398.aspx
  • Wow, mur de texte. 🙂 Mais merci, je n'ai pas lu encore. Je le ferai quand je reçois une chance.
  • C'est toutes d'excellentes choses, mais le peu sur déchirement est seulement un ou deux paragraphes.
  • Get +23 question score, accepter -18 réponse. F**k la logique.
  • isvolatileusefulwiththreads.com (ou @DavidHeffernan, software.intel.com/en-us/blogs/2013/01/06/... est à lire absolument morceau sur "bénigne" données courses)
  • Quand utiliser: jamais.
  • par exemple, si c'est "bien" d'avoir une course" à Chaque fois que c'est bien d'utiliser un mutex. Ou atomique. À peu près tous les non trivial MT programmes inoffensifs conditions de course.