さかもとのブログ

つらつらと

SICP演習問題3.47

;;exercise3.47
(define (make-semaphore n)
  (let ((s n)
        (mutex (make-mutex)))
    (define (aquire)
      (mutex 'acquire)  ;mutexを保護する
      (if (> count 0)
          (begin
            (set! s (- s 1)) ;sを変更
            (mutex 'release)) ;保護していたmutexを解放
          (begin
            (mutex 'release) ;s < 0なのでacquireしたmutexを解放
            (acquire))))     ;もういちどacquire
    (define (release)
      (mutex 'acquire) ;mutexを保護
      (set! s (+ s 1))
      (mutex 'release)) ;mutexを解放
    (define (dispatch m)
      (cond [(eq? m 'acquire) acquire]
            [(eq? m 'release) release]))
    dispatch))