理系学生日記

おまえはいつまで学生気分なのか

問題3-41 (3.4.1 The Nature of Time in Concurrent Systems)

Ben がここ変えたらしいんだけど,

(define (make-account balance)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  ;; continued on next page

  (let ((protected (make-serializer)))
    (define (dispatch m)
      (cond ((eq? m 'withdraw) (protected withdraw))
            ((eq? m 'deposit) (protected deposit))
            ((eq? m 'balance)
             ((protected (lambda () balance)))) ; serialized <= ここ!!!!!
            (else (error "Unknown request -- MAKE-ACCOUNT"
                         m))))
    dispatch))

atomic にしなきゃいけないのは*1代入操作が発生する部分で,読み出しは安全.特に変える必要はないんじゃないかと.

*1:SICP で出てくる make-serializer の実装は atomic なわけじゃないけど