2016-09-21 39 views
0

该作业是转换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程序,所以我可能会错过一些非常微不足道的东西。任何意见将不胜感激。

谢谢。

+0

请确定src和dest中¿用VAL高度任何关系? – Krlos

+0

src和dst是数组。运行从src读取值,将新值写入dst。 – user557583

回答

0

删除引用为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