;;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))