Atomic updates: Difference between revisions
Content added Content deleted
Alpha bravo (talk | contribs) No edit summary |
(Added zkl) |
||
Line 3,357: | Line 3,357: | ||
tsv::set still going 0 |
tsv::set still going 0 |
||
thread::broadcast thread::exit</lang> |
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}} |
{{omit from|AWK}} |