RosettaCodeData/Task/Checkpoint-synchronization/Oforth/checkpoint-synchronization.fth

24 lines
737 B
Forth

: task(n, jobs, myChannel)
while(true) [
System.Out "TASK " << n << " : Beginning my work..." << cr
System sleep(1000 rand)
System.Out "TASK " << n << " : Finish, sendind done and waiting for others..." << cr
jobs send($jobDone) drop
myChannel receive drop
] ;
: checkPoint(n, jobs, channels)
while(true) [
#[ jobs receive drop ] times(n)
"CHECKPOINT : All jobs done, sending done to all tasks" println
channels apply(#[ send($allDone) drop ])
] ;
: testCheckPoint(n)
| jobs channels i |
ListBuffer init(n, #[ Channel new ]) dup freeze ->channels
Channel new ->jobs
#[ checkPoint(n, jobs, channels) ] &
n loop: i [ #[ task(i, jobs, channels at(i)) ] & ] ;