2011-03-14 2 views
5

Lorsqu'un objet immuable est mis à jour dans un thread, et partagé dans un deuxième thread (disons comme un champ d'objet partagé), le second thread ne devrait-il pas se synchroniser?Est-ce que l'objet immuable doit être accessible à travers la barrière de mémoire en C#?

Thread1: 
========= 
x = new SomeObject() 

Thread2 
========= 
if (x != null) 
x.DoSomething() 

Faut-il une barrière de mémoire avant x.DoSomething()? est-il possible que l'assignation à x dans le premier thread ne soit jamais visible au second thread? Quel est le modèle de publication sécurisé pour .NET?

Répondre

2

Oui, il est possible que le thread 2 ne verra jamais une valeur non nulle de x avec le code que vous avez écrit (en fonction de la façon dont le code est optimisé). Vous n'avez pas besoin d'une barrière de mémoire explicite. Déclarez simplement x comme volatile.

+0

ok. Existe-t-il des informations/de la documentation relatives à la publication sécurisée pour .NET? – drr

+1

Je suppose que cela dépend exactement de ce que vous voulez faire. Je regarderais dans la bibliothèque de modèles parallèles sur MSDN comme point de départ. En dehors de cela, vous avez à peu près les primitives de synchronisation. Vous pouvez également consulter le journal Web de Joe Duffy. Il parle un peu des points plus précis du verrouillage et de l'accès aux données parallèles. –

+0

Je ne connais aucune documentation qui le dit, mais pour être sûr, il faudrait des barrières de mémoire sur l'écriture et la lecture. Ce que vous pouvez obtenir à travers plusieurs façons comme mentionné, verrous, volatile, Thread.VolatileRead/Write, les appels explicites à MemoryBarrier. Voir [threading in C#] (http://www.albahari.com/threading/part4.aspx#_Memory_Barriers_and_Volatility) pour plus d'informations – BrandonAGr

Questions connexes