concurrency - X10 并行处理共享变量

标签 concurrency parallel-processing x10-language

如果我的问题不专业,请见谅。我正在阅读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,并且在spawn多线程之前,只创建一个rand,不同的线程是否会共享相同的rand并产生竞赛条件?如果不是,为什么?

最佳答案

很高兴您担心这里可能出现的竞争条件。它在随机数生成器的并行调用中经常被忽视。

幸运的是,这个例子没有 RNG 竞争条件。 k for 循环的每次迭代都会创建一个随机数生成器的新实例(并为其播种)并生成一个线程。由于 countPoints 调用自己的 RNG,因此这里不存在竞争条件。

关于concurrency - X10 并行处理共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11002010/

相关文章:

x10-language - X10中 'async'之前或之后的 'for'有什么区别?

linux - 如何编译 x10 示例?

Java BlockingQueue 在 take() 上阻塞,略有不同

基于可用 FREE cpu 的 Java 并发性

multithreading - Powershell 可以并行运行命令吗?

java - 在 Java 中从 WebService 调用并行进程

go - 所有goroutine都处于 sleep 状态-死锁(无限循环+选择)

java - Lock 是否保证 happens-before 关系?

Python - 并行运行多个获取请求并在第一次响应时停止