Checkpoint synchronization: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (→{{header|Perl 6}}: Reduce waiting times. long delays make it tedious for automated testing.) |
|||
Line 2,141: | Line 2,141: | ||
Worker 1 is done and update batch 2 complete counter to 3 of 3 |
Worker 1 is done and update batch 2 complete counter to 3 of 3 |
||
>>>>> batch 2 completed. |
>>>>> 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> |
</pre> |
||