per implementare un serratura di codice libero per il multithreading applicazione che ho usato volatile
variabili, Teoricamente: Il volatile
parola chiave viene utilizzata semplicemente per fare in modo che tutte le discussioni vedono il valore più aggiornata di un variabile volatile; quindi se il thread A
aggiorna il valore della variabile e il thread B
legge quella variabile subito dopo l'aggiornamento verrà visualizzato il valore più aggiornato che è stato scritto di recente dal thread A. Come ho letto in un C# 4.0 in poche parole book che questo è corretto perchéVolatile e Thread.MemoryBarrier in C#
applicando volatili non impedisce una scrittura seguita da una lettura di essere scambiati.
Potrebbe questo problema essendo risolto mettendo Thread.MemoryBarrier()
prima di ogni get della variabile volatile
come:
private volatile bool _foo = false;
private void A()
{
//…
Thread.MemoryBarrier();
if (_foo)
{
//do somthing
}
}
private void B()
{
//…
_foo = true;
//…
}
E se questo risolve il problema; considera che abbiamo un ciclo while che dipende da quel valore in una delle sue condizioni; sta mettendo Thread.MemoryBarrier()
prima del ciclo while è un modo corretto per risolvere il problema? Esempio:
private void A()
{
Thread.MemoryBarrier();
while (_someOtherConditions && _foo)
{
// do somthing.
}
}
Per essere più precisi voglio la variabile _foo
di dare il suo valore più fresco quando una qualsiasi discussione per chiedere in qualsiasi momento; quindi se l'inserimento Thread.MemoryBarrier()
prima di chiamare la variabile risolve il problema, allora potrei usare Foo
proprietà invece di _foo
e fare un Thread.MemoryBarrier()
all'interno del get di tale proprietà come:
Foo
{
get
{
Thread.MemoryBarrier();
return _foo;
}
set
{
_foo = value;
}
}
Possibile duplicato ... http: //stackoverflow.com/questions/1330590/when-to-use-volatile-or-thread-memorybarrier-in-threadsafe-locking-code-c –
@Aron; no non è duplicato; questa è un'altra domanda. –
@Jalal Stai cercando di risolvere un problema utilizzando questo approccio volatile/memorybarrier o stai bene con qualsiasi approccio che risolva il tuo problema? –