Следующий тестовый код (F #) не возвращает результат я бы ожидать:.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
Я бы ожидать, что SpinLock
взаимно исключают счетчик, и, следовательно, для того, чтобы вернуться насчитывает 1,000,000, но вместо этого он возвращает меньшие значения, как если бы не было взаимного исключения.
Любые идеи, что не так?
Спасибо. Похоже, что поля в классах не копируются, а все остальное. Если это правильно, это также имеет последствия для других приложений, таких как сложная арифметика, где вы хотите избежать копирования структур (а C# в настоящее время намного быстрее, чем F #). –