在Scala循环中为多线程创建ForkJoinTask时出现的奇怪行为
问题描述:
该作业是转换src数组中的值并将新值写入dst数组。在Scala循环中为多线程创建ForkJoinTask时出现的奇怪行为
当我在while循环
val height: Int = 4;
val numTasks: Int = 2;
var tasks = scala.collection.mutable.ListBuffer.empty[ForkJoinTask[Unit]]
val jump: Int = src.height/numTasks
var from: Int = 0;
while (from < height) {
val end: Int = height.min(from + jump);
val t: ForkJoinTask[Unit] = task {
run(src, dst, from, end) // (2,2), (2,1), what is happening?
}
from = end
}
for (t <- tasks.toList) {
t.join()
}
创建的ForkJoinTasks然后奇怪的是,在运行函数采用(来自,结束)的参数的值作为(2,2)。但是,如果我手动将它分成两个任务,那么它正常工作,如(0,1)和(1,2)。
val t1 = task {
run(src, dst, 0, height/2); // (0, 1)
}
val t2 = task {
run(src, dst, height/2, height); // (1, 2)
}
t1.join()
t2.join()
我很难弄清楚发生了什么事情。这是我第一个Scala程序,所以我可能会错过一些非常微不足道的东西。任何意见将不胜感激。
谢谢。
答
删除引用为src或DST代码似乎确定为回报范围
import shapeless.PolyDefns.~>
import shapeless.{ HList, HNil }
import io.netty.util.internal.chmv8.ForkJoinTask
object main extends App {
val height: Int = 4;
val numTasks: Int = 2;
var tasks = scala.collection.mutable.ListBuffer.empty[ForkJoinTask[Unit]]
val jump: Int = height/numTasks
var from: Int = 0;
while (from < height) {
val end: Int = height.min(from + jump);
val t: ForkJoinTask[Unit] = {
run(from, end) // (2,2), (2,1), what is happening?
}
from = end
}
for (t <- tasks.toList) {
t.join()
}
def run (from: Int, end:Int) ={
println(s"$from $end")
null
}
}
+0
我意识到了为什么。从var开始引用它,当它的值在循环中更改时,传递给函数run的值也会发生变化。在你的例子中,这样不会被捕获,但是如果你在运行函数中做了更重的计算,你会注意到它。 – user557583
请确定src和dest中¿用VAL高度任何关系? – Krlos
src和dst是数组。运行从src读取值,将新值写入dst。 – user557583