問題3.47 – SICP(計算機プログラムの構造と解釈)その143
2009年04月01日
問題3.47
a. 相互排除器を使った場合
(define (make-semaphore n) (let ((counter 0) (mutex (make-mutex))) (define (the-semaphore m) (cond ((eq? m 'acquire) (mutex 'acquire) (if (> counter n) (begin (mutex 'release) (the-semaphore m)) ; retry (begin (set! counter (+ counter 1)) (mutex 'release)))) ((eq? m 'release) (mutex 'acquire) (set! counter (- counter 1)) (mutex 'release)) (else (error "Unknown message -- SEMAPHORE" m)))) the-semaphore))
b. test-and-set!
を使った場合
(define (make-semaphore n) (let ((counter 0) (cell (list #f))) (define (the-semaphore m) (cond ((eq? m 'acquire) (if (or (> counter n) (test-and-set! cell)) (the-semaphore m) ; retry (begin (set! counter (+ counter 1)) (clear! cell)))) ((eq? m 'release) (set! counter (- counter 1)) (clear! cell)) (else (error "Unknown message -- SEMAPHORE" m)))) the-semaphore))
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542