#!/usr/local/bin/guile \ -e main -s !# ;;; $Id: prodcons.guile,v 1.3 2001/06/29 23:12:37 doug Exp $ ;;; http://www.bagley.org/~doug/shootout/ (use-modules (ice-9 threads)) (define mutex (make-mutex)) (define access (make-condition-variable)) (define count 0) (define data 0) (define produced 0) (define consumed 0) ;; the consumer thread definition seems wrong ;; how does it ever stop/get joined? (define (consumer n) (let ((i 0)) (while #t (lock-mutex mutex) (while (= count 0) (wait-condition-variable access mutex)) (set! i data) (set! count 0) (signal-condition-variable access) (unlock-mutex mutex) (set! consumed (+ consumed 1))))) (define (producer n) (do ((i 1 (+ i 1))) ((> i n)) (lock-mutex mutex) (while (= count 1) (wait-condition-variable access mutex)) (set! data i) (set! count 1) (signal-condition-variable access) (unlock-mutex mutex) (set! produced (+ produced 1)))) (define (main args) (let ((n (or (and (= (length args) 2) (string->number (cadr args))) 1))) (let ((c (make-thread (lambda () (consumer n))))) (producer n) (join-thread c) (display produced) (display " ") (display consumed) (newline))))