Пожалуйста, простите меня, если мой вопрос не является профессиональным. Я читаю учебники IBM x10. Вот код, который вычисляет PI, но меня смущает:X10 Параллельная обработка общей переменной
public static def countPoints(n: Int, rand:()=>Double) {
var inCircle: Double = 0.0;
for (var j:Long = 1; j<=n; j++) {
val x = rand();
val y = rand();
if (x*x +y*y <= 1.0) inCircle++;
}
return inCircle;
}
val N = args.size() > 0 ? Long.parse(args(0)) : 100000;
val THREADS = args.size() > 1 ? Int.parse(args(1)) : 4;
val nPerThread = N/THREADS;
val inCircle = new Array[Long](1..THREADS);
finish for(var k: Int =1; k<=THREADS; k++) {
val r = new Random(k*k + k + 1);
val rand =() => r.nextDouble();
val kk = k;
async inCircle(kk) = countPoints(nPerThread,rand);
}
var totalInCircle: Long = 0;
for(var k: Int =1; k<=THREADS; k++) {
totalInCircle += inCircle(k);
}
val pi = (4.0*totalInCircle)/N;
Сама программа не трудно, на мой вопрос, так как в каждом countPoints() называют это неоднократно называя аргумент рандов, и перед грибницы мульти-нитей, только один ранд создан, будут ли разные темы разделять одни и те же ранды и нести условия гонки? Если нет, то почему?