【SICP练习】116 练习3.42

练习3-42

原文

Exercise 3.42. Ben Bitdiddle suggests that it’s a waste of time to create a new serialized procedure in response to every withdraw and deposit message. He says that make-account could be changed so that the calls to protected are done outside the dispatch procedure. That is, an account would return the same serialized procedure (which was created at the same time as the account) each time it is asked for a withdrawal procedure.

(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)))

Is this a safe change to make? In particular, is there any difference in what concurrency is allowed by these two versions of make-account ?

分析

对于Ben的make-account函数而言,如果有以下5种操作:

(protected-deposit 10)
(protected-deposit 20)
(protected-deposit 40)
(protected-deposit 80)
(protected-deposit 160)

由于它们都会调用同一个protected-deposit串行化对象来调用请求,这意味着在处理第一个操作时,其他4个操作也即开始并发地运行,那么除了第一个操作之外,其余操作均会出错。这是因为运行中的串行化进程是不能被其他的过程所干扰的。

相比之下,原版的make-account函数则会在求值多种操作时,将所有的表达式都放进串行化组protected中,这样它们就可以并发的执行而不会被彼此所干扰。




感谢访问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。



为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


时间: 2024-09-24 19:10:06

【SICP练习】116 练习3.42的相关文章

数据库性能分析及调整一例

数据|数据库|性能 故障现象2004年6月8日上午10:00,内蒙古巴盟网通用户反映在OSS系统界面"话单查询"里查询单个用户五天的话单特别慢,查询很长时间无结果. 例如:在OSS系统界面"综合查询"内点击"收费"-〉"话单查询",键入"用户号码,起始时间:2004-01-01 00:00:00,结束时间:2004-06-01 23:00:00",点击查询后,IE进度条缓慢,很长时间不返回结果.故障分析经过

Akka Cluster原理与应用

Akka集群原理 Akka集群支持去中心化的基于P2P的集群服务,没有单点故障(SPOF)问题,它主要是通过Gossip协议来实现.对于集群成员的状态,Akka提供了一种故障检测机制,能够自动发现出现故障而离开集群的成员节点,通过事件驱动的方式,将状态传播到整个集群的其它成员节点. 状态转移与故障检测 Akka内部为集群成员定义了一组有限状态(6种状态),并给出了一个状态转移矩阵,代码如下所示: 1 private[cluster] val allowedTransitions: Map[Mem

中国城市经纬度表(精确到县区)Google地图用

2015-5-16 补充说明:  1.完整示例讲解:http://blog.csdn.net/a497785609/article/details/45287619 (包含建表语句,js文件) 2.Demo下载:http://download.csdn.net/detail/a497785609/8633615 [上海市] 城市:上海上海 经度:121.48 纬度:31.22; 城市:上海嘉定 经度:121.24 纬度:31.4; 城市:上海宝山 经度:121.48 纬度:31.41; 城市:上

【SICP练习】71 练习2.42

 练习2.42 这道题曾经在C#中写过,但是写出来的代码却没有Lisp中的朴素.用了一大堆的数组和for循环.但是在这里,用car.cdr来构造就行了. 我们按书中给出的步骤来一步一步求解这个问题.首先是棋局,就按书上的示意图,从上往下的来排皇后的位置.诸如此时书中皇后的位置为:'(6 3 1 7 5 8 2 4). 然后就是过程adjoin-position.rest-of-queens是在前k-1列放置k-1个皇后的一种方式,new-row是在第k列放置所考虑的编号.因此这一过程定义为:

【SICP练习】37 练习1.42

 练习1.42 这道题让我彻底爱上了lambda. 复合这一概念早在数学中便已经学过了,我们先来根据题目的意思写出能够平方和能够加一这两个过程.可能是因为我看书不认真吧,写了很多次才完成这两个过程. 一开始我都是以(define (inc f)......)来开始的,但是每次都没有返回结果.终于醒悟了,过程嘛,就是像前面第41最下面所讲的一种关联那样,我们是要将一个lambda表达式关联到一个名字上面,这个名字于是就变成了过程名.而且过程本身也根本不需要传入参数,这又不是函数. (defin

【SICP练习】42 练习2.1

 练习2.1 我们已经进入了新的一章,这本书还是蛮会循序渐进的嘛,第一题挺简单的. (define(make-rat n d)    (let ((g (gcd n d)))       (if (< d 0)         (cons (- (/ n g)) (- (/ d g)))         (cons n d))))

SICP第三章题解

SICP第三章题解 标签(空格分隔): SICP [toc] ex3-17 统计一个表结构中的序对个数 (define (count-pairs x) (count-helper x '())) (define (count-helper x seq) (if (memq? x seq) (count-helper (cdr x) seq) (count-helper (cdr x) (list x seq)) ) ) ex3-18 判断一个表中是否包含环. 我的思路:还是用memq去判断. (

把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另一个vector,也是将一个vector 的元素逐个赋值给另一vector 的对应元素: //将一个vector 赋值给另一vector,使用迭代器访问vector 中的元素 vector<int> ivec(10, 20); vector<int> ivec1; for (vecto

DreamweaverMX Ultradev探索(4-2)

dreamweaver DreamweaverMX Ultradev探索(4-2)修改数据库中的记录 <4> 嗯,这是不错了,那我怎么知道这里要显示哪一条记录呢?和用户点击的对不号怎么办?不用急,DW MX早就给我们想好了一切了,LOOK-!就是Move To Specific Record(移动到特定记录)!Application-->Server Behaviors-->Recordset Paging-->Move To Specific Record,同样,这也是DW