El siguiente código de prueba (F #) no devuelve el resultado que cabe esperar:.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
yo esperaría que la SpinLock
excluyen mutuamente a la barra y, por lo tanto, para que vuelva cuenta de 1,000,000 pero, en cambio, devuelve valores más pequeños como si no existiera una exclusión mutua.
¿Alguna idea de qué pasa?
Gracias. Parece que los campos de las clases no se copian sino todo lo demás. Si eso es correcto, también tiene implicaciones para otras aplicaciones, como la aritmética compleja, donde se desea evitar copiar estructuras (y C# es actualmente mucho más rápido que F #). –