Marco Russo

.NET, Business Intelligence e dintorni

Corsi

Miei blog in inglese

Atomicità in C#

Da qualche giorno sono disponibili le specifiche complete di C# 3.0 con un testo unificato di 500 pagine che non è più una somma di funzioni da una versione all'altra. Rileggendo parte di cose già note, mi sono imbattuto in questa frase.

[...] Reads and writes of other types, including long, ulong, double, and decimal, as well as user-defined types, are not guaranteed to be atomic. [...] there is no guarantee of atomic read-modify-write, such as in the case of increment or decrement.

Questo implica la necessità di "proteggere" l'accesso a dati condivisi in ambito multithread anche su operazioni "semplici" su questi tipi di dati. Mentre su double e decimal ci si potrebbe scommettere, su long e ulong magari ci si trova un po' spiazzati, considerando che sono disponibili macchine a 64 bit. Ma, si sa, la compatibilità viene prima.

Comments

freeteo said:

Ciao Marco, stavo leggendo questo post e mi è venuto in mente che probabilmente per essere facilitati nel risovere questo tipo di problemi, forse converrebbe usare il CCR (Concurrency and Coordination Runtime) di ms...cosa ne pensi?

msdn2.microsoft.com/.../bb648749.aspx

Questa libreria nasce per robotics (msdn2.microsoft.com/.../default.aspx), ma è puro codice managed quindi utilizzabile in qualsiasi applicazione...

Ciao.

Matteo Raumer

# settembre 1, 2007 2.38

marco said:

Matteo,

il CCR (che ho adocchiato sin dalle prime preview) è molto interessante per alcuni tipi di software, al di là dei robot. Nel caso specifico del mio post, tuttavia, la considerazione era un po' a monte di tutto: l'accesso a un'istruzione "atomica" in genere non pone problemi di consistenza dovuti a un accesso concorrente (pensa a un contatore che numera le richieste processate da un thread pool, per esempio). Poter considerare "atomica" l'operazione di incremento di un int e non poterlo fare per un long è qualcosa che non è così intuitivo, specialmente per chi fosse abituato a lavorare in C++ e magari stia sviluppando espressamente per x64.

Era più una curiosità che altro - il numero di volte in cui l'accesso a un tipo primitivo non avviene all'interno di una struttura più grande, con una protezione sulla concorrenza a monte, sono veramente poche...

Ciao e grazie per il commento!

Marco

# settembre 3, 2007 8.44

freeteo said:

Concordo con te,ed hai fatto bene a far notare questa cosa, perche' è abbastanza "spiazzante", anche perche' spesso alcune problematiche vengono date imprudentemente per scontate.

La mia dul CCR era una riflessione piu' che altro, diciamo una sorta di "sinapse" che mi ha portato a collegare il tuo posto con quello che sto guardando in questi giorni :)

Grazie a te...ciao!

# settembre 3, 2007 9.55