【SICP练习】114 练习3.38-3.39

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


时间: 2024-10-22 16:55:59

【SICP练习】114 练习3.38-3.39的相关文章

C#实现按键精灵的'找图' '找色' '找字'的功能

背景:游戏辅助功能通常使用按键精灵编写脚本,按键精灵的最大卖点就是能够找到画面中字,图,色,这对于模拟用户鼠标操作至关重要,这能找到道具,找到血量,实现自动打怪,自动补血,自动买卖道具,博主闲来无聊,看到一款按键精灵实现的辅助,于是乎想用WPF也写一款辅助工具,实现其核心的找图找色等功能.博主测试,对于背景复杂多变的画面,找不变图的成功率达到100%,找带透明的图,比如文字,能达到90%以上.默认您已经知道一个颜色值由argb构成,每个值范围都是0~255.网上发现不少人询问过该问题,几乎没有比

Office文件的奥秘——.NET平台下不借助Office实现Word、Powerpoint等文件的解析(一)

原文 http://www.cnblogs.com/mayswind/archive/2013/03/17/2962205.html   [题外话] 这是2010年参加比赛时候做的研究,当时为了实现对Word.Excel.PowerPoint文件文字内容的抽取研究了很久,由于Java有 POI库,可以轻松的抽取各种Office文档,而.NET虽然有移植的NPOI,但是只实现了最核心的Excel文件的读写,所以之后查了很多资料才实 现了Word和PowerPoint文件文字的抽取.之后忙于各种事情

Linux桌面系统字体配置详解(二)

字体配置实战 下面,将以Fedora 20为例,自己动手将它配置为正确的显示效果.目前,在Linux系统上配置字体的工具是Fontconfig. 为什么是Fontconfig 感谢这个时代,曾经混乱不堪的字体配置方法终于被Fontconfig一统江湖.在Linux中,字体配置曾经各自为政.混乱不堪,XServer.Xft.GTK.GTK2.QT等等各自采用不同的配置手段,字体引擎也有Type1.FreeType等.目前,可以认为在Linux系统中只需要配置FontConfig即可. XOrg的官

基于AQS实现互斥信号(BooleanMutex)

背景   最近一个月都在做项目,我主要负责分布式任务的调度的功能,需要实现一个分布式的授权控制.   具体的需求:   1.  首先管理员启动整个任务,并设置执行权限   2.  工作节点收到消息后就会创建对应的线程,并开始执行任务(任务都是由一个管理员进行分配)   3.  运行过程中管理员需要临时中断某个任务,需要设置一个互斥信号,此时对应的工作节点都需要被阻塞,注意不是完全销毁 分析  先抛开分布式通讯这一块,首先从单个jvm如何实现进行分析, 简单点来说:  在单jvm中就是两种线程,一

介绍几个好用的android自定义控件

首先看效果图, 看下这两个界面,第一个中用到了一个自定义的FlowRadioGroup,支持复合子控件,自定义布局: 第二个界面中看到了输入的数字 自动4位分割了吧:也用到了自定义的DivisionEditText控件. 下面直接看源码FlowRadioGroup了: 1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0

《unix设备驱动》块设备驱动程序(加示例代码)

块设备驱动程序 一个块设备驱动程序主要通过传输固定大小的随机数据来访问设备. 块驱动程序是在核心内存和其他存储介质之间的管道,因此他们可以认为是虚拟内存子系统的组成部分.   一些概念 一个数据块指的是固定大小的数据,而大小的值有内核决定  与数据块对应的是扇区,它是由底层硬件决定大小的一个块.  无论何时内核向用户提供一个扇区编号,该扇区的大小就是512字节. 注册 注册的目的:使内核知道设备的存在 注册块设备驱动程序 注册到内核 int register_blkdev(unsigned in

常用ASCII 码对照表

目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准.适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式. 因为1位二进制数可以表示(21=)2种状态:0.1:而2位二进制数可以表示(22)=4种状态:00.01.10.11:依次类推,7位二进制数可以表示(27

关于shared pool的深入探讨(三)

link: http://www.eygle.com/internal/shared_pool-3.htm       基本命令: ALTER SESSION SET EVENTS 'immediate trace name LIBRARY_CACHE level LL'; 其中LL代表Level级别,对于9.2.0及以后版本,不同Level含义如下:Level =1 ,转储Library cache统计信息Level =2 ,转储hash table概要Level =4 ,转储Library

.net操纵xml文件类(c#)

xml 一直想要写一个操作XML文件的类,今天在网上找了一下,找到一个已写的差不多的类,对其进行扩展与修改,最终成了以下代码,供新手参考参考.//在此类中用到了XML事件.此类中对于节点的查找必需用xpath表达式,如果你对xpath表达式不了解可以查看我收藏的另外一篇文章:+XML文件操作:[学习xpath]XPath最通俗的教程+   1using System;  2using System.Xml;  3using System.Web;  4namespace solucky  5{ 

解决图随机上传,不限量,定位置,与文章进库同步完成

发布文章.或者新闻.或者产品说明,这一类的图片.文字均有的资料,要求的是,根据文章的需要随时插入图片.并且由其自己指定对齐方式.文字进库,图片上传? adddata.php文件的代码:   1<html>  2<head>  3<title>增加数据</title>  4<meta http-equiv="Content-Type" content="text/html; charset=gb2312">