乐正

Actions speak louder than words.

Sicp-ex3-42

问题

Ben Bitdiddle 建议说,在响应每个withdrawdeposit消息时创建一个新的串行化过程完全就是浪费时间。他说,可以修改make-account,使得对protected的调用都可以在过程dispatch之外进行。这样,在每次要求去执行提款过程时,这个账户将总返回同一个串行化过程(它是与这个账户同时创建的)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(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)
  (let ((protected (make-serializer)))
    (let ((protected-withdraw (protected withdraw))
          (protected-deposit  (protected deposit)))
      (define (dispatch m)
        (cond ((eq? m 'withdraw) protected-withdraw)
              ((eq? m 'deposit) protected-deposit)
              ((eq? m 'balance) balance)
              (else (error "Unknown request -- MAKE-ACCOUNT" m))))
      dispatch)))

这样修改安全吗?特别是这样修改之后,在所允许的并发性方面,make-account的两个版本之间有什么不同?

解答

这样修改应该是不安全的。

draft

« sicp-ex3-41 sicp-ex3-43 »

Comments