問題3.48、問題3.49 – SICP(計算機プログラムの構造と解釈)その144

問題3.48

デッドロックになるプロセスの推移

SICP 問題3.48 デッドロックになるプロセスの推移図

デッドロックを回避するプロセスの推移(口座番号小さい a2 から先にアクセスする)

SICP 問題3.48 デッドロックを回避するプロセスの推移図

(define (exchange account1 account2)
  (let ((difference (- (account1 'balance)
                       (account2 'balance))))
       ((account1 'withdraw) difference)
       ((account2 'deposit) difference)))

(define (make-account-and-serializer balance id)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (let ((balance-serializer (make-serializer)))
       (define (dispatch m)
         (cond ((eq? m 'withdraw) withdraw)
               ((eq? m 'deposit) deposit)
               ((eq? m 'balance) balance)
               ((eq? m 'serializer) balance-serializer)
               ((eq? m 'id) id)
               (else (error "Unknown request -- make-account" m))))
       dispatch))

(define (serialized-exchange account1 account2)
  (let ((serializer1 (account1 'serializer))
        (serializer2 (account2 'serializer)))
       (if (> (account1 'id) (account2 'id))
           ((serializer1 (serializer2 exchange))
            account1
            account2)
           ((serializer2 (serializer1 exchange))
            account2
            account1))))

問題3.49

最初のアクセス先の内容によって次のアクセス先を決定するような場合。

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