2012-12-03 22 views
6

Voglio vedere l'utilizzo in tempo reale della parola chiave Volatile in C#. ma non sono in grado di proiettare il miglior esempio. il seguente codice di esempio funziona senza la parola chiave Volatile come è possibile?Qual è lo scopo della parola chiave volatile in C#?

class Program 
{ 
    private static int a = 0, b = 0; 

    static void Main(string[] args) 
    { 
     Thread t1 = new Thread(Method1); 
     Thread t2 = new Thread(Method2); 

     t1.Start(); 
     t2.Start(); 

     Console.ReadLine(); 
    } 

    static void Method1() 
    { 
     a = 5; 
     b = 1; 
    } 

    static void Method2() 
    { 
     if (b == 1) 
      Console.WriteLine(a); 
    } 
} 

Nel codice precedente sto ottenendo un valore 5. come funziona senza utilizzare la parola chiave volatile?

+1

Non funziona. Dato che hai dimenticato di usare 'volatile', ti aspetti di ottenere un valore diverso da 5. Eppure ottieni 5. Quindi è * non * funzionante, che è quello che ti aspetteresti di lasciare qualcosa. (Risolvi il bug e il mistero andrà via. Il codice con bug di thread è quasi impossibile da capire. Basta correggerli e dimenticarsene.) –

+0

Puoi dirmi un esempio migliore per volatile? – Gun

+0

Ora, senza alcuna parola chiave 'volatile', non c'è ** garanzia ** che il programma non restituisca '0'. Potrebbe (qualche giorno) emettere '0'. Se si aggiunge la parola chiave 'volatile', non può restituire '0', può solo dare _either_ nessun output _or_' 5'. –

risposta

11

La parola chiave volatile indica al compilatore che una variabile può cambiare in qualsiasi momento, quindi non dovrebbe ottimizzare la lettura e la scrittura della variabile.

Considerate codice come questo:

int sum; 
for (var i = 0; i < 1000; i++) { 
    sum += x * i; 
} 

come variabile x non cambia all'interno del ciclo, il compilatore potrebbe leggere la variabile, una volta al di fuori del ciclo e basta usare lo stesso valore per tutto il ciclo.

Se si effettua la variabile x volatile, il compilatore leggere il valore della variabile ogni volta che viene utilizzato, quindi se si modifica il valore in un thread diverso, il nuovo valore verrà utilizzato immediatamente.

2

Se si utilizza volatile correttamente, il codice è garantito per funzionare. Se si lascia fuori volatile dove il codice lo richiede, probabilmente funzionerà bene la maggior parte del tempo, ma non è garantito e probabilmente fallirà quando danneggerà di più.

Capire come il codice con le gare di threading fallisce o non fallisce richiede una profonda comprensione dell'implementazione e della piattaforma. Non è semplice e di solito non vale la pena preoccuparsi. Segui le regole e il tuo codice funzionerà sempre.

Problemi correlati