;;; -*- mode: lisp -*- ;;; $Id: prodcons.cmucl,v 1.1 2001/04/26 03:53:05 doug Exp $ ;;; http://www.bagley.org/~doug/shootout/ ;;; From Jochen Schmidt (defparameter *counter* 0) (defparameter *produced* 0) (defparameter *consumed* 0) (defparameter *data* 0) (defparameter *mutex* (mp:make-lock "Big Lock")) (defun producer (n) (declare (optimize (speed 3) (safety 0)) (fixnum n)) (loop :for i :of-type fixnum :from 1 :to n :do (mp:process-wait "Producer is waiting on Consumer" #'(lambda () (= *counter* 0))) (mp:with-lock-held (*mutex*) (setf *data* i *counter* 1)) (incf *produced*))) (defun consumer (n) (declare (optimize (speed 3) (safety 0)) (fixnum n)) (let ((i 0)) (declare (fixnum i)) (loop (mp:process-wait "Consumer is waiting on Producer" #'(lambda () (= *counter* 1))) (mp:with-lock-held (*mutex*) (setf i *data* *counter* 0)) (incf *consumed*) (when (= i n) (return))))) (let ((n (parse-integer (or (car pop11::poparglist) "1")))) (declare (optimize (speed 3) (safety 0)) (fixnum n)) (setf *counter* 0 *produced* 0 *consumed* 0 *data* 0) (let ((producer (mp:make-process #'(lambda () (funcall #'producer n)) :name "Producer")) (consumer (mp:make-process #'(lambda () (funcall #'consumer n)) :name "Consumer"))) (mp:process-wait "Wait on Producer" #'(lambda () (eq (mp:process-state producer) :killed))) (mp:process-wait "Wait on Consumer" #'(lambda () (eq (mp:process-state consumer) :killed))) (format t "~A ~A~%" *produced* *consumed*))