2012-06-12 50 views
2

請原諒我,如果我的問題不專業。我正在閱讀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()調用它重複調用參數蘭特,之前產卵多線程,只一個蘭特被創建,不同的線程將共享相同的蘭特並引發競爭狀態?如果不是,爲什麼?

回答

2

好,你擔心這裏可能的競爭條件。並行調用隨機數生成器常常忽略它。

幸運的是,這個例子沒有RNG競爭條件。 k for循環的每次迭代都會創建一個隨機數生成器的新實例(並對其進行種子處理)並生成一個線程。由於countPoints稱其自己的RNG,因此這裏沒有競爭條件。