SICP Practice

Practice 3.45

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

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

运行过程serialized-exchange, (serializer1 (serializer2 exchange))返回一个过程, 和exchange行为相同,只是在运行前请求mutex,运行结束释放mutex, ((serializer1 (serializer2 exchange)) account1 account2) 运行中内部会执行(account1 ‘withdraw) 和 (account2 ‘deposit), 这两个过程也是用账户内部的balance-serializer串行化过的,和(serializer1 (serializer2))不会同时执行,所以会发生死锁。