Checkpoint synchronization: Difference between revisions

Added BBC BASIC
(Checkpoint Synchronization - Haskell)
(Added BBC BASIC)
Line 187:
D ends shift
</pre>
 
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<lang bbcbasic> INSTALL @lib$+"TIMERLIB"
nWorkers% = 3
DIM tID%(nWorkers%)
tID%(1) = FN_ontimer(10, PROCworker1, 1)
tID%(2) = FN_ontimer(11, PROCworker2, 1)
tID%(3) = FN_ontimer(12, PROCworker3, 1)
DEF PROCworker1 : PROCtask(1) : ENDPROC
DEF PROCworker2 : PROCtask(2) : ENDPROC
DEF PROCworker3 : PROCtask(3) : ENDPROC
ON ERROR PROCcleanup : REPORT : PRINT : END
ON CLOSE PROCcleanup : QUIT
REPEAT
WAIT 0
UNTIL FALSE
END
DEF PROCtask(worker%)
PRIVATE cnt%()
DIM cnt%(nWorkers%)
CASE cnt%(worker%) OF
WHEN 0:
cnt%(worker%) = RND(30)
PRINT "Worker "; worker% " starting (" ;cnt%(worker%) " ticks)"
WHEN -1:
OTHERWISE:
cnt%(worker%) -= 1
IF cnt%(worker%) = 0 THEN
PRINT "Worker "; worker% " ready and waiting"
cnt%(worker%) = -1
PROCcheckpoint
cnt%(worker%) = 0
ENDIF
ENDCASE
ENDPROC
DEF PROCcheckpoint
PRIVATE checked%, sync%
IF checked% = 0 sync% = FALSE
checked% += 1
WHILE NOT sync%
WAIT 0
IF checked% = nWorkers% THEN
sync% = TRUE
PRINT "--Sync Point--"
ENDIF
ENDWHILE
checked% -= 1
ENDPROC
DEF PROCcleanup
LOCAL I%
FOR I% = 1 TO nWorkers%
PROC_killtimer(tID%(I%))
NEXT
ENDPROC</lang>
'''Output:'''
<pre>
Worker 1 starting (23 ticks)
Worker 3 starting (26 ticks)
Worker 2 starting (13 ticks)
Worker 2 ready and waiting
Worker 1 ready and waiting
Worker 3 ready and waiting
--Sync Point--
Worker 3 starting (2 ticks)
Worker 1 starting (23 ticks)
Worker 2 starting (2 ticks)
Worker 3 ready and waiting
Worker 2 ready and waiting
Worker 1 ready and waiting
--Sync Point--
Worker 3 starting (8 ticks)
Worker 1 starting (28 ticks)
Worker 2 starting (5 ticks)
</pre>
 
=={{header|C}}==