問題3.47 – SICP(計算機プログラムの構造と解釈)その143

問題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))
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»