如果我的问题不专业,请原谅我。我正在阅读IBM x10的教程。这是计算PI的代码,但让我困惑:
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()中调用它反复调用参数rand,并且在生成多线程之前,只创建一个rand,不同的线程将共享相同的rand并招致竞争条件?如果没有,为什么?
答案 0 :(得分:2)
你好担心这里可能出现的竞争状况。在并行调用随机数生成器时经常会忽略它。
幸运的是,这个例子没有RNG竞争条件。 k
for循环的每次迭代都会创建一个随机数生成器的新实例(并对其进行种子处理)并生成一个线程。由于countPoints
称自己为RNG,因此此处没有竞争条件。