文档章节

【SICP练习】114 练习3.38-3.39

NoMasp
 NoMasp
发布于 2015/09/08 21:45
字数 642
阅读 2
收藏 0

练习3-38

原文

Exercise 3.38. Suppose that Peter, Paul, and Mary share a joint bank account that initially contains 100. Concurrently, Peter deposits 10, Paul withdraws 20, and Mary withdraws half the money in the account, by executing the following commands:

Peter: (set! balance (+ balance 10))
Paul: (set! balance (- balance 20))
Mary: (set! balance (- balance (/ balance 2)))

a. List all the different possible values for balance after these three transactions have been completed, assuming that the banking system forces the three processes to run sequentially in some order.

b. What are some other values that could be produced if the system allows the processes to be interleaved? Draw timing diagrams like the one in figure 3.29 to explain how these values can occur.

分析

a小题中题目假定银行系统强迫着三个进程按照某种顺序方式进行。将3个人(或者说3个进程)全排序有A(3,3)=3X2X1=6种方式。具体为:
Peter (110) -> Paul (90) -> Mary (45)
Peter (110) -> Mary (55) -> Paul (35)
Paul (80) -> Peter (90) -> Mary (45)
Paul (80) -> Mary (40) -> Peter (50)
Mary (50) -> Peter (60) -> Paul (40)
Mary (50) -> Paul (30) -> Peter (40)

b小题参照书中第209页即可,由于编辑较困难在此就不予列出了。

练习3-39

原文

Exercise 3.39. Which of the five possibilities in the parallel execution shown above remain if we instead serialize execution as follows:

(define x 10) 

(define s (make-serializer)) 

(parallel-execute (lambda () (set! x ((s (lambda () (* x x)))))) (s (lambda () (set! x (+ x 1)))))

分析

做这道题之前必须理解书中的示例。另外加入了make-serializer进行串行化后,P1和P2(表示传入parallel-execute的无参过程)的执行不回交错进行。题目中的以下两行代码均为串行化操作。

((s (lambda () (* x x))))
((s (lambda () (set! x (+ x 1)))))

如果将这两段代码用LS1和LS2来代替,则题中的代码简化为:

(parallel-execute (lambda () (set! x LS1)) LS2)

因此会有2种可能的执行顺序:
LS2 - > (set! x LS1)
(set! x LS1) - > LS2
相应的执行结果如下:
1) LS2 - > (set! x (+ x 1)) - > x = 11
(set! x (* x x)) - > x = 121
2) (set! x LS1) - > (set! x (* x x)) - > x = 100
(set! x (+ x 1)) - > x = 101
但还有一种可能,当执行(set! x LS1)时,由于要先执行LS1,而不可能这个操作并未执行完LS2并已经开始了,最后又折回来执行(set! x LS1)。执行顺序为:
LS1 - > (set! x LS1) - > LS2 - > (set! x LS1)
不过在第一个(set! x LS1)时,该步骤并未彻底执行完。相应的执行结果为121。



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


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


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.csdn.net/nomasp

本文转载自:http://blog.csdn.net/nomasp/article/details/44649665

NoMasp
粉丝 7
博文 334
码字总数 0
作品 0
镇江
程序员
私信 提问
ArduinoYun教程之Arduino环境与Linux环境的桥梁Bridge

ArduinoYun教程之Arduino环境与Linux环境的桥梁Bridge Arduino环境与Linux环境的桥梁——Bridge 在第一章中介绍Arduino Yun硬件的时候提到过,它上面有两个处理器ATmega32U4和Atheros 9331。...

大学霸
2015/07/02
803
0
VmWare5.5主机Citrix桌面实施方案(二)

三、配置数据库服务器 安装数据库服务器 分别在三台机器上安装SQL2008运行安装程序 图示3.1 点击确定继续 图示3.2 使用全新安装 图示3.3 图示3.4 输入密钥继续 图示3.5 接受条款 图示3.6 进行...

sunx990
2016/02/06
0
0
controller源码编译时,模块yang-test和sal-test-model总出错

controller源码编译时,模块yang-test和sal-test-model总出错,就是该模块下的java文件中类似这样的语句: import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.cont...

bluesky_hust
2016/03/10
188
0
FileZilla Client 3.38.0-rc1 发布,流行的 FTP 解决方案

FileZilla Client 3.38.0-rc1 发布了,这是 3.38 的首个 RC 版,带来了一些新特性,bug 修复以及一些小的变更 —— 新特性 现在,在按住 Ctrl 的同时刷新远程文件列表会清除当前服务器的远程...

局长
2018/10/21
445
0
ResNet网络识别验证码实战练习——高准确率的机器学习模型

原文链接:https://finthon.com/resnet-captcha/ 简介 在使用Python+Tensorflow的CNN技术快速识别验证码一文中,我们使用了3层简单的CNN卷积神经网络完成了验证码的识别,准确率不是特别高。...

MrLonelyZC88
01/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部