2010-04-29 2 views
35

Non sono riuscito a trovare alcun riferimento a questo nelle documentazioni ...È l'assegnazione variabile e la lettura dell'operazione atomica?

Assegna a un doppio (o qualsiasi altro tipo semplice, incluso booleano) un'operazione atomica vista dal punto di vista dei thread?

double value = 0; 

public void First() { 
while(true) { 
    value = (new Random()).NextDouble(); 
} 
} 

public void Second() { 
while(true) { 
    Console.WriteLine(value); 
} 
} 

In questo esempio di codice, il primo metodo viene chiamato in un thread e il secondo in un altro. Il secondo metodo può ottenere un valore incasinato se ottiene l'esecuzione durante l'assegnazione alla variabile in un altro thread?

Non mi interessa se si riceve il vecchio valore, è solo importante ricevere un valore valido (non uno dove sono impostati 2 byte su 8). So che è una domanda stupida, ma voglio essere sicuro, perché non so come CLR in realtà imposta le variabili.

+27

Questa non è una domanda stupida. –

+0

@EricLippert Oggetto a = 10; anche questa è un'operazione atomica? Ho letto MSDN, i tuoi articoli ecc. Ma non riesco a trovare una risposta. in quanto comporta 2 passaggi. boxe e quindi assegnazione – Ehsan

+0

@NoOne: la mutazione della variabile 'a' è atomica perché' object' è un tipo di riferimento. Il pugilato non entra in esso. –

risposta

24

Per rispondere alla tua domanda, no. Le assegnazioni ai doppi non sono garantite per essere atomiche. I documenti sono disponibili here. Fondamentalmente, < = i tipi built-in a 32 bit sono atomici, i tipi> 64-bit no. Per le operazioni atomiche su tipi a 64 bit, è possibile utilizzare i metodi su System.Threading.Interlocked