para implementar un bloqueo de código libre para multithreading aplicación Solía volatile
variables, Teóricamente: La palabra clave volatile
se utiliza simplemente para asegurarse de que todos los hilos ver el valor más actualizada de una variable volátil; así que si el hilo A
actualiza el valor de la variable y el hilo B
lee esa variable justo después de que se haya realizado la actualización verá el valor más actualizado escrito recientemente desde el hilo A. Cuando leo en un C# 4.0 en Nutshell libro que esto es incorrecto porquevolátil y Thread.MemoryBarrier en C#
aplicar volátil no impide que una escritura seguido de una lectura de ser intercambiado.
Podría este problema a resolver poniendo Thread.MemoryBarrier()
antes de cada get de la variable volatile
como:
private volatile bool _foo = false;
private void A()
{
//…
Thread.MemoryBarrier();
if (_foo)
{
//do somthing
}
}
private void B()
{
//…
_foo = true;
//…
}
Y si esto resuelve el problema; consideramos que tenemos un ciclo while que depende de ese valor en una de sus condiciones; está poniendo Thread.MemoryBarrier()
antes del ciclo while es una forma correcta de solucionar el problema? ejemplo:
private void A()
{
Thread.MemoryBarrier();
while (_someOtherConditions && _foo)
{
// do somthing.
}
}
Para ser más exacto que quiero la variable _foo
para dar su valor más fresco cuando cualquier tema preguntando por él en cualquier momento; por lo que si la inserción Thread.MemoryBarrier()
antes de llamar a la variable fija el problema, entonces podría utilizar Foo
propiedad en lugar de _foo
y hacer un Thread.MemoryBarrier()
dentro de la escapada de esa propiedad como:
Foo
{
get
{
Thread.MemoryBarrier();
return _foo;
}
set
{
_foo = value;
}
}
Posible duplicar ... http: //stackoverflow.com/questions/1330590/when-to-use-volatile-or-thread-memorybarrier-in-threadsafe-locking-code-c –
@Aron; no, no está duplicado; esta es otra pregunta. –
@Jalal ¿Estás tratando de resolver un problema usando este enfoque volátil/memorybarrier o estás bien con cualquier enfoque que resuelva tu problema? –