(define-structure main () (open rep rep.system rep.threads rep.threads.mutex rep.threads.condition-variable) (declare (unsafe-for-call/cc)) (define mutex (make-mutex)) (define access (make-condition-variable)) (define count 0) (define data -1) (define produced 0) (define consumed 0) (define (consumer n) (let ((i 0)) (while (/= i n) (obtain-mutex mutex) (while (= count 0) (condition-variable-wait access mutex)) (setq i data) (setq count 0) (setq consumed (1+ consumed)) (condition-variable-signal access) (release-mutex mutex)))) (define (producer n) (do ((i 1 (+ i 1))) ((> i n)) (obtain-mutex mutex) (while (= count 1) (condition-variable-wait access mutex)) (setq data i) (setq count 1) (setq produced (1+ produced)) (condition-variable-signal access) (release-mutex mutex))) (let* ((arg (get-command-line-option "--num" t)) (n (if arg (string->number arg) 1)) (c (make-thread (lambda () (consumer n))))) (producer n) (thread-join c) (format standard-output "%d %d\n" produced consumed)))