Il seguente codice di prova (F #) non restituisce il risultato che ci si aspetta:.NET 4 SpinLock
let safeCount() =
let n = 1000000
let counter = ref 0
let spinlock = ref <| SpinLock(false)
let run i0 i1() =
for i=i0 to i1-1 do
let locked = ref false
try
(!spinlock).Enter locked
if !locked then
counter := !counter + 1
finally
if !locked then
(!spinlock).Exit()
let thread = System.Threading.Thread(run 0 (n/2))
thread.Start()
run (n/2) n()
thread.Join()
!counter
mi aspetto il SpinLock
di escludere reciprocamente il bancone e, di conseguenza, per poter tornare conta 1.000.000 ma, invece, restituisce valori più piccoli come se non si verificasse alcuna esclusione reciproca.
Qualche idea cosa c'è che non va?
Grazie. Sembra che i campi nelle classi non vengano copiati ma tutto il resto. Se questo è giusto, ha anche implicazioni per altre applicazioni come l'aritmetica complessa, in cui si desidera evitare di copiare le strutture (e C# è attualmente molto più veloce di F #). –