\ $Id: prodcons.gforth,v 1.1 2001/06/20 20:55:44 doug Exp $
\ http://www.bagley.org/~doug/shootout/
\ from Bernd Paysan
require tasker.fs
\ read NUM from last command line argument
0. argc @ 1- arg >number 2drop drop constant NUM
Variable pcount
Variable data
Variable produced
Variable consumed
\ note: no mutex is needed here. bigFORTH's tasker is cooperative
\ and switches tasks only with PAUSE.
: producer
next-task swap 2 $1000 NewTask pass
0 ?DO
BEGIN pcount @ 1 = WHILE pause REPEAT
1 pcount ! I data !
1 produced +!
LOOP wake ;
: consumer
next-task swap 2 $1000 NewTask pass
0 swap 0 ?DO
BEGIN pcount @ 0= WHILE pause REPEAT
0 pcount ! drop data @
1 consumed +!
LOOP drop wake ;
NUM producer
NUM consumer
\ There is no "main" task - to synchronize, each of the two new
\ threads get the task address of the starting task, and wake it
\ when they are done. The main task therefore has to stop twice
\ (and wait to be woken up)
stop stop
produced @ .
consumed @ 1 u.r cr
bye \ th-th-that's all folks!