Ecco il mio contributo alla comprensione collettiva di questo comportamento ... Non è molto, solo una dimostrazione (basata sulla demo di xkip) che mostra il comportamento di un volatile versi un valore int non volatile (cioè "normale"), fianco a fianco -side, nello stesso programma ... che è quello che stavo cercando quando ho trovato questo thread.
using System;
using System.Threading;
namespace VolatileTest
{
class VolatileTest
{
private volatile int _volatileInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _volatileInt = 1; }).Start();
while ( _volatileInt != 1 )
;
Console.WriteLine("_volatileInt="+_volatileInt);
}
}
class NormalTest
{
private int _normalInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _normalInt = 1; }).Start();
while ( _normalInt != 1 )
;
Console.WriteLine("_normalInt="+_normalInt);
}
}
class Program
{
static void Main() {
#if DEBUG
Console.WriteLine("You must run this program in Release mode to reproduce the problem!");
#endif
new VolatileTest().Run();
Console.WriteLine("This program will now hang!");
new NormalTest().Run();
}
}
}
Ci sono alcune spiegazioni succinte davvero eccellenti sopra, oltre ad alcuni ottimi riferimenti. Grazie a tutti per avermi aiutato a capire volatile
(almeno abbastanza da sapere non fare affidamento su volatile
dove fosse il mio primo istinto lock
).
Saluti e grazie per TUTTO il pesce. Keith.
PS: Sarei molto interessato a una demo della richiesta originale, che era: "Mi piacerebbe vedere un int volatile statico che si comporta correttamente quando un int statico si comporta male.
Ho provato e fallito questa sfida. (In realtà ho rinunciato abbastanza velocemente ;-). In tutto ciò che ho provato con le variabili statiche si comportano "correttamente" indipendentemente dal fatto che siano o meno volatili ... e mi piacerebbe una spiegazione del PERCHE 'è così, se davvero è così ... È così il compilatore non memorizza nella cache i valori delle variabili statiche nei registri (cioè memorizza nella cache invece un riferimento a quell'indirizzo di heap)?
No questa non è una nuova domanda ... è un tentativo di Stear la comunità torna alla domanda iniziale.