zoukankan      html  css  js  c++  java
  • 【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


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

  • 相关阅读:
    PAT A1023 Have Fun with Numbers (20) [⼤整数运算 高精度]
    算法笔记-数学问题-高精-大整数
    PAT A1130 Infix Expression (25) [中序遍历]
    PAT A1130 Infix Expression (25分) [二叉树中序遍历 中缀表达式]
    PAT A1129 Recommendation System (25) [set的应⽤,运算符重载]
    PAT A1118 Birds in Forest (25) [并查集]
    PAT A1124 Raffle for Weibo Followers (20分) [map vector]
    C++ STL
    PAT A1121 Damn Single (25) [map set hash]
    算法笔记-易错记录
  • 原文地址:https://www.cnblogs.com/NoMasp/p/4786088.html
Copyright © 2011-2022 走看看