29 lines
868 B
Text
29 lines
868 B
Text
class B{
|
|
const N=10;
|
|
var [const]
|
|
buckets=(1).pump(N,List).copy(), //(1,2,3...)
|
|
lock=Atomic.Lock(), cnt=Atomic.Int();
|
|
fcn init{ "Initial sum: ".println(values().sum()); }
|
|
fcn transferArb{ // transfer arbitary amount from 1 bucket to another
|
|
b1:=(0).random(N); b2:=(0).random(N);
|
|
critical(lock){
|
|
t:=(0).random(buckets[b1]);
|
|
buckets[b1]=buckets[b1]-t; buckets[b2]=buckets[b2]+t;
|
|
}
|
|
cnt.inc();
|
|
}
|
|
fcn transferEq{ // try to make two buckets equal
|
|
b1:=(0).random(N); b2:=(0).random(N);
|
|
critical(lock){
|
|
v1:=buckets[b1]; v2:=buckets[b2];
|
|
t:=(v1-v2).abs()/2;
|
|
if (v1<v2) t = -t;
|
|
buckets[b1]=v1-t; buckets[b2]=v2+t;
|
|
}
|
|
cnt.inc();
|
|
}
|
|
fcn values{ critical(lock){buckets.copy()} }
|
|
}
|
|
|
|
fcn threadA(b){ while(1) { b.transferArb(); } }
|
|
fcn threadE(b){ while(1) { b.transferEq(); } }
|