我有以下代码:
const char
我认为以这种方式访问arrayToAccess变量不是线程安全的。如何以线程安全的方式实现上述代码?另外,我可以控制anotherArray.par的并行度(例如,只使用8个可用的2个内核)吗?如果没有,有没有办法控制它?
答案 0 :(得分:2)
你正在思考它。 只是做:
arrayToAccess = anotherArray.par
.map { mathematicalCalculation _ }
.seq
.sorted
.reverse
.take(5)
它产生与您的代码相同的结果,但是线程安全。
更新如果您担心排序步骤需要时间,您可以在线性时间中选择前五名:
val top(data: Array[Int], n: Int) = {
val queue = PriorityQueue()(Ordering[Int].reverse)
data.fold(queue) { case(q,n) =>
q.enqueue(n)
while(q.size > 5) q.dequeue
queue
}
.toArray
.sorted
.reversed
关于配置并行性,我认为,这应该有所帮助:http://docs.scala-lang.org/overviews/parallel-collections/configuration
更新如果您担心排序步骤,可以用并行排序替换它,或者在线性时间折叠到有界优先级队列中,如下所示:
def topN(data: Array[Int], n: Int) = {
val queue = PriorityQueue()(Ordering[Int].reverse)
data.foldLeft(queue) { case (q, x) =>
q.enqueue(x)
while(q.size > n) q.dequeue
q
}.dequeueAll.reverse