练习3-41
原文
Exercise 3.41. Ben Bitdiddle worries that it would be better to implement the bank account as follows (where the commented line has been changed):
(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))
because allowing unserialized access to the bank balance can result in anomalous behavior. Do you agree?
Is there any scenario that demonstrates Ben’s concern?分析
假设有((protected withdraw) 100)和((protected deposit) 50)两个进程分别和balance并行执行。则会有4种可能的执行顺序。
withdraw - > balance 操作时,首先将余额设置为0,然后返回balance得到0。 balance - > withdraw操作时,首先balance会得到100,然后执行withdraw操作得到0。 deposit - > balance操作时,首先将余额设置为150,然后返回balance得到150。 balance - > deposit操作时,首先balance会得到100,然后deposit操作得到150。 由此可见Ben并没有担心的必要。感谢访问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。
为使本文得到斧正和提问,转载请注明出处:
版权声明:本文为 NoMasp柯于旺 原创文章,如需转载请联系本人。