首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >X10并行处理共享变量

X10并行处理共享变量
EN

Stack Overflow用户
提问于 2012-06-13 01:47:14
回答 1查看 178关注 0票数 2

如果我的问题不专业,请原谅。我正在阅读IBM的x10教程。以下是计算PI的代码,但让我感到困惑:

代码语言:javascript
复制
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并引起竞争条件吗?若否,原因为何?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-26 06:16:23

很好,您在这里担心可能的竞争条件。在随机数生成器的并行调用中,它经常被忽略。

幸运的是,这个例子没有RNG竞争条件。k for循环的每次迭代都会创建一个随机数生成器的新实例(并将其设定为种子),并产生一个线程。因为countPoints调用它自己的RNG,所以这里没有竞争条件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11002010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档