【发布时间】:2015-10-26 13:43:08
【问题描述】:
对于迭代范围的所有索引,下面的代码 sn-p 是否会正确写入results?
虽然有多个线程同时访问同一个对象;由于索引,每个线程都在写入内存中的唯一位置。
let results:NewType[] = Array.zeroCreate temp.Length
let mutable data = Unchecked.defaultof<OldType>
let loopResult =
System.Threading.Tasks.Parallel.For(
0,
temp.Length,
(fun i ->
data <- temp.[i]
results.[i] <- NewType(data.X, data.Y)
)
)
【问题讨论】:
-
正如已经指出的那样,这不是线程安全的,但也不是高性能的。因为不同的内核写入和读取相同的内存区域(数据),所以内核之间可能会有很多“聊天”以确保缓存的一致性(取决于架构)。为了获得良好的并行性能,您需要确保每个内核可以相互独立地执行(即不共享可变数据)。一个提示是始终将单核性能与多核性能进行比较。令人惊讶的是,人们经常看到减速而不是加速。最容易通过更改进程亲和性来完成
标签: .net multithreading parallel-processing f#