Atomic updates: Difference between revisions
Content added Content deleted
(Refactored process creation code into a new function) |
|||
Line 2,676: | Line 2,676: | ||
$t1->join; $t2->join; $t3->join;</lang> |
$t1->join; $t2->join; $t3->join;</lang> |
||
=={{header|Phix}}== |
|||
Requires Phix 0.6.7 or later |
|||
<lang Phix> |
|||
constant nBuckets = 20 |
|||
sequence buckets = tagset(nBuckets) -- {1,2,3,..,20} |
|||
constant bucket_cs = init_cs() -- critical section |
|||
atom equals = 0, rands = 0 -- operation counts |
|||
integer terminate = 0 -- control flag |
|||
procedure mythreads(integer eq) |
|||
-- if eq then equalise else randomise |
|||
integer b1,b2,amt |
|||
while not terminate do |
|||
b1 = rand(nBuckets) |
|||
b2 = rand(nBuckets) |
|||
if b1!=b2 then -- (test not actually needed) |
|||
enter_cs(bucket_cs) |
|||
if eq then |
|||
amt = floor((buckets[b1]-buckets[b2])/2) |
|||
equals += 1 |
|||
else |
|||
amt = rand(buckets[b1]+1)-1 |
|||
rands += 1 |
|||
end if |
|||
buckets[b1] -= amt |
|||
buckets[b2] += amt |
|||
leave_cs(bucket_cs) |
|||
end if |
|||
end while |
|||
exit_thread(0) |
|||
end procedure |
|||
procedure display() |
|||
enter_cs(bucket_cs) |
|||
?{sum(buckets),equals,rands,buckets} |
|||
leave_cs(bucket_cs) |
|||
end procedure |
|||
display() |
|||
constant threads = {create_thread(routine_id("mythreads"),{1}), -- equalise |
|||
create_thread(routine_id("mythreads"),{0})} -- randomise |
|||
constant ESC = #1B |
|||
while not find(get_key(),{ESC,'q','Q'}) do |
|||
sleep(1) |
|||
display() |
|||
end while |
|||
terminate = 1 |
|||
wait_thread(threads) |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
{210,0,0,{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}} |
|||
{210,1326977,1619458,{14,17,10,7,9,6,8,5,9,7,6,10,14,12,12,14,13,15,12,10}} |
|||
{210,2637987,3137483,{10,7,4,31,1,11,5,6,16,11,9,15,9,13,15,5,5,10,6,21}} |
|||
{210,3973762,4619906,{22,38,9,17,9,10,12,0,3,0,13,11,2,39,4,11,9,0,0,1}} |
|||
{210,5327923,6082436,{1,0,0,9,23,1,33,7,1,43,8,17,1,6,30,0,24,2,3,1}} |
|||
{210,6671482,7561288,{12,11,2,9,11,4,11,9,13,9,9,20,19,10,10,8,11,11,12,9}} |
|||
{210,7950733,9131581,{7,9,10,8,11,8,13,12,11,5,6,8,11,16,15,14,15,11,11,9}} |
|||
{210,9272164,10625022,{4,8,28,2,13,13,6,32,12,5,10,4,28,1,12,9,4,9,4,6}} |
|||
{210,10615451,12117282,{10,17,18,2,7,13,10,2,12,4,19,10,18,12,9,5,12,11,8,11}} |
|||
{210,11912322,13610386,{10,7,15,11,12,8,12,10,15,14,10,7,9,10,8,11,8,10,13,10}} |
|||
{210,13243566,15099214,{8,12,11,7,12,13,13,8,9,9,16,10,10,8,10,10,8,10,13,13}} |
|||
</pre> |
|||
=={{header|PicoLisp}}== |
=={{header|PicoLisp}}== |
||
We use database objects (persistent symbols) for the buckets, and |
We use database objects (persistent symbols) for the buckets, and |