Checkpoint synchronization: Difference between revisions

m (→‎{{header|Perl 6}}: Reduce waiting times. long delays make it tedious for automated testing.)
Line 2,141:
Worker 1 is done and update batch 2 complete counter to 3 of 3
>>>>> batch 2 completed.
</pre>
 
=={{header|Phix}}==
Simple multitasking solution: no locking required, no race condition possible, supports workers leaving and joining.
<lang Phix>constant NPARTS = 3
integer workers = 0
sequence waiters = {}
bool terminate = false
 
procedure checkpoint(integer task_id)
if length(waiters)+1=NPARTS then
printf(1,"checkpoint\n")
for i=1 to length(waiters) do
task_schedule(waiters[i],1)
end for
waiters = {}
else
waiters &= task_id
task_suspend(task_id)
end if
end procedure
 
procedure worker(string name)
printf(1,"worker %s running\n",{name})
while not terminate do
printf(1,"worker %s begins part\n",{name})
task_delay(rnd())
printf(1,"worker %s completes part\n",{name})
checkpoint(task_self())
if rnd()>0.95 then exit end if
task_delay(rnd())
end while
printf(1,"worker %s leaves\n",{name})
workers -= 1
end procedure
 
string name = "A"
 
while get_key()!=#1B do -- (key escape to shut down)
if workers<NPARTS then
integer task_id = task_create(routine_id("worker"),{name})
task_schedule(task_id,1)
name[1] += 1
workers += 1
end if
task_yield()
end while
terminate = true
while workers>0 do
task_yield()
end while</lang>
{{out}}
<pre style="height: 200px;overflow:scroll">
worker A running
worker A begins part
worker B running
worker B begins part
worker C running
worker C begins part
worker B completes part
worker C completes part
worker A completes part
checkpoint
worker B begins part
worker C begins part
worker A begins part
worker B completes part
worker A completes part
worker C completes part
checkpoint
worker B begins part
worker C begins part
worker A begins part
worker B completes part
worker C completes part
worker A completes part
checkpoint
worker B begins part
worker B completes part
worker C begins part
worker C completes part
worker A begins part
worker A completes part
checkpoint
worker A leaves
worker C begins part
worker B begins part
worker D running
worker D begins part
worker D completes part
worker C completes part
worker B completes part
checkpoint
worker B begins part
worker D begins part
worker B completes part
worker D completes part
worker C begins part
worker C completes part
checkpoint
worker B begins part
worker D begins part
worker C begins part
worker B completes part
worker C completes part
worker D completes part
checkpoint
worker B begins part
worker D begins part
worker C begins part
worker D completes part
worker B completes part
worker C completes part
checkpoint
worker C begins part
worker D begins part
worker B begins part
worker C completes part
worker B completes part
worker D completes part
checkpoint
worker C leaves
worker D leaves
worker B leaves
</pre>
 
7,818

edits