Atomic updates: Difference between revisions

Added zkl
No edit summary
(Added zkl)
Line 3,357:
tsv::set still going 0
thread::broadcast thread::exit</lang>
 
=={{header|zkl}}==
Threads and thread safe objects (locks, lists, ints, etc) are built in.
<lang zkl>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(); } }</lang>
<lang zkl>b:=B();
do(10){ threadA.launch(b); } do(10){ threadE.launch(b); }
 
while(1){
v:=b.values();
v.println("-->",v.sum()," ", b.cnt.value," transfers ",
vm.numThreads," threads");
Atomic.sleep(2.5);
}</lang>
{{out}}
<pre>
Initial sum: 55
L(8,8,7,4,2,2,6,4,4,10)-->55 24 transfers 20 threads
L(1,3,5,6,8,8,1,8,10,5)-->55 33755 transfers 20 threads
L(6,5,4,2,7,6,11,1,7,6)-->55 67616 transfers 20 threads
L(5,8,5,5,9,4,4,4,5,6)-->55 101434 transfers 20 threads
L(4,1,6,9,10,4,5,5,4,7)-->55 135013 transfers 20 threads
L(7,6,5,4,5,4,4,7,7,6)-->55 168516 transfers 20 threads
L(2,4,5,3,4,14,1,5,11,6)-->55 202241 transfers 20 threads
L(7,5,2,3,14,8,6,6,1,3)-->55 235660 transfers 20 threads
L(8,7,9,8,7,6,1,1,6,2)-->55 269039 transfers 20 threads
L(7,4,8,17,3,2,1,5,5,3)-->55 302837 transfers 20 threads
L(4,5,4,5,10,5,5,5,3,9)-->55 336642 transfers 20 threads
</pre>
 
 
{{omit from|AWK}}
Anonymous user