乐正

Actions speak louder than words.

Sicp-ex3-40

问题

请给出下面的执行可能产生出的所有x值:

1
2
3
4
(define x 10)

(parallel-execute (lambda () (set! x (* x x)))
                  (lambda () (set! x (* x x x))))

如果我们改用下面的串行化过程,上述可能性中的哪些还会存在:

1
2
3
4
5
6
(define x 10)

(define s (make-serializer))

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

解答

将上述两个过程分别记为$P_1$和$P_2$,那么在第一种情况中,会出现的情况如下:

  • $P_1$将x设为100,$P_2$将x设为1000000
  • $P_2$将x设为1000,$P_2$将x设为100000
  • $P_2$将x从10设为1000的过程发生在$P_1$两次访问x之间,这两次是为了求值(* x x)
  • $P_1$访问x,而后$P_2$给x赋值,最后$P_1$又设置x
  • $P_2$访问x(三次),而后$P_1$设置x,最后$P_2$又设置x

当采用串行化过程后,还会出现的情况是:

  • $P_1$将x设为100,$P_2$将x设为1000000

draft

« sicp-ex3-39 sicp-ex3-41 »

Comments