#!/usr/bin/newlisp # # prodcons.lsp - Producer/consumer # # usage of 'fork', 'semaphore' and 'share' (load "winfork.lsp") (constant 'wait -1 'sig 1 'release 0) (define (consumer n) (set 'i 0) (while (< i n) (semaphore cons-sem wait) (println (set 'i (share data)) " <-") (semaphore prod-sem sig)) (exit)) (define (producer n) (for (i 1 n) (semaphore prod-sem wait) (println "-> " (share data i)) (semaphore cons-sem sig)) (exit)) (define (run n) (set 'data (share)) (share data 0) (set 'prod-sem (semaphore)) ; get semaphores (set 'cons-sem (semaphore)) (set 'prod-pid (winfork '(producer n))) ; start threads (set 'cons-pid (winfork '(consumer n))) (semaphore prod-sem sig) ; get producer started (sleep 1000) ; make sure semaphores are not released too early (semaphore cons-sem release) ; release semaphores (semaphore prod-sem release)) (run 10) (exit)