2016-09-21 2 views
0

Задача состоит в том, чтобы преобразовать значения из массива src и записать новые значения в массив dst.Странное поведение при создании ForkJoinTask для многопоточности в цикле Scala

Когда я создаю ForkJoinTasks в цикле в то время как

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() 
} 

Тогда странно, функция запуска занимает (с, конец) аргументов значение как (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 ¿никакого отношения валь высоты? – Krlos

+0

src и dst - массивы. run считывает значения из src, записывает новые в dst. – user557583

ответ

0

Удаление ссылки на ЦСИ или 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 сделал ссылку, поэтому, когда его значение изменяется в цикле, значение, переданное в функцию, также изменяется. В вашем примере такие не будут пойманы, но если вы сделаете более тяжелый расчет в функции запуска, вы заметите это. – user557583