Joe Albahari a une grande série sur le multithreading, c'est une lecture indispensable et doit être connu par cœur pour tous ceux qui font de C# multithreading.
Dans la partie 4 toutefois, il mentionne les problèmes avec les volatiles:
Notez que l'application de volatiles qui n'empêche pas une écriture suivie par un lire d'être échangé, et cela peut créer des casse-têtes. Joe Duffy illustre le problème avec l'exemple suivant: si Test1 et Test2 exécuter simultanément sur les différents threads, il est possible pour un et b à la fois jusqu'à la fin avec une valeur de 0 (malgré l'utilisation de la volatilité sur à la fois x et y)
Suivie par une note que la documentation MSDN est incorrect:
La documentation MSDN stipule que l'utilisation du mot clé volatile assure que le les plus up-to-date de valeur est présente dans le champ à tout moment. C'est inexact, puisque, comme nous l'avons vu, une écriture suivie par une lecture peut être réorganisées.
J'ai vérifié la documentation MSDN, qui a été modifié en 2015, mais encore les listes:
Le mot clé volatile indique qu'un champ peut être modifié par plusieurs threads qui s'exécutent en même temps. Les champs qui sont déclaré volatiles ne sont pas soumis à des optimisations du compilateur que supposons accès par un seul thread. Cela garantit que la plupart des up-to-date de valeur est présente dans le champ à tout moment.
Droit maintenant, j'ai toujours éviter de volatiles en faveur de la plus prolixe pour éviter de threads à l'aide des données périmées:
private int foo;
private object fooLock = new object();
public int Foo {
get { lock(fooLock) return foo; }
set { lock(fooLock) foo = value; }
}
Comme les parties à propos de multithreading ont été écrites en 2011, l'argument est-il encore valable aujourd'hui? Devrait volatils encore être évité à tout prix en faveur de serrures ou de mémoire complète de clôtures pour empêcher l'introduction très dur pour produire des bugs, comme l'a mentionné sont même dépend de la CPU fournisseur, il est en cours d'exécution sur?