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柯于旺 原创文章,如需转载请联系本人。

  • 相关阅读:
    Language Integrated Query
    为什么说 LINQ 要胜过 SQL
    LINQ(Language Integrated Query)
    Rx (Reactive Extensions)介绍
    ReactiveX Operators
    ReactiveX
    给 iOS 开发者的 RxSwift(一)
    The features of Swift
    RxSwift源码与模式分析一:基本类
    智力
  • 原文地址:https://www.cnblogs.com/NoMasp/p/4786088.html
Copyright © 2011-2022 走看看