J'ai lu récemment sur les barrières de la mémoire et le problème de réorganisation et maintenant j'ai une certaine confusion à ce sujet.Mémoire Barrière par instruction lock
Envisagez le scénario suivant:
private object _object1 = null;
private object _object2 = null;
private bool _usingObject1 = false;
private object MyObject
{
get
{
if (_usingObject1)
{
return _object1;
}
else
{
return _object2;
}
}
set
{
if (_usingObject1)
{
_object1 = value;
}
else
{
_object2 = value;
}
}
}
private void Update()
{
_usingMethod1 = true;
SomeProperty = FooMethod();
//..
_usingMethod1 = false;
}
à
Update
méthode; l'instruction_usingMethod1 = true
est-elle toujours exécutée avant d'obtenir ou de définir la propriété? ou en raison de problème de réorganisation, nous ne pouvons pas garantir cela?Doit-on utiliser
volatile
commeprivate volatile bool _usingMethod1 = false;
Si nous utilisons
lock;
pouvons-nous garantir alors chaque déclaration dans le verrou sera exécuté afin que:private void FooMethod() { object locker = new object(); lock (locker) { x = 1; y = a; i++; } }
Merci pour l'information, Cela m'aide vraiment à mieux comprendre le concept .. Ce que j'ai besoin de faire est de m'assurer que l'instruction "_usingMethod1 = true" sera toujours faite avant l'instruction suivante SomeProperty = FooMethod(); En multithread senario comment accomplir cela? est par: _usingMethod1 = true; Thread.MemoryBarrier(); SomeProperty = FooMethod(); ou verrouiller pour des clôtures complètes donc pas de réordonnancement: lock (locker) {_usingMethod1 = true; } SomeProperty = FooMethod(); ou peut-être simplement en faisant du _usingMethod1 une variable volatile. Merci de votre aide. –
J'embaquerais tout le contenu de la méthode Update dans un verrou. En plus des barrières à la mémoire, il garantit également l'atomicité, ce qui est tout aussi important. En outre, ces idiomes sans verrou (via volatile, Thread.MemoryBarrier, etc.) sont incroyablement difficiles à obtenir. –