博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【SICP练习】114 练习3.38-3.39
阅读量:6047 次
发布时间:2019-06-20

本文共 2206 字,大约阅读时间需要 7 分钟。

练习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。



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


为使本文得到斧正和提问,转载请注明出处:


版权声明:本文为 NoMasp柯于旺 原创文章,如需转载请联系本人。

转载于:https://www.cnblogs.com/NoMasp/p/4786088.html

你可能感兴趣的文章
C++进阶之一
查看>>
linux下按在mongodb
查看>>
iptables 详解
查看>>
vSphere HA 5.x系列的高级参数及详细用途说明
查看>>
码农新手遇到了SVN
查看>>
find命令总结
查看>>
不发短信获取短信中心号
查看>>
在vc6上搭建sdl的开发环境
查看>>
C#设计模式(5)——建造者模式(Builder Pattern)
查看>>
实现一个迷你版的RPC
查看>>
我的友情链接
查看>>
python之enumerate函数使用
查看>>
selenium2.0最简单的例子for_java
查看>>
这个一个test
查看>>
我的友情链接
查看>>
vmware 克隆centos6.6无法上网解决办法
查看>>
我的友情链接
查看>>
让 Smokeping 支持中文
查看>>
大数据13天
查看>>
windows下安装mysql(非msi安装版)mysql-5.6.26-winx64
查看>>