Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
37 lines (29 sloc) 1.42 KB
(define x 10)
(define s (make-serializer))

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

本题问的是按照上面这种串行方式,之前正文的那 5 种可能哪些可能还出现。

我们先来简单分析下, 由于 s 的作用,使得其内的过程按某种顺序依次执行。

我们首先回顾下正文 5 种情况的出现场景:

(define x 10)
(parallel-execute
  ; P1
  (lambda () (set! x (* x x)))
  ; P2
  (lambda () (set! x (+ x 1))))

x 将具有下面 5 个可能值(具体结果将依赖 P1 和 P2 种各个事件的交错情况):

  • 101。P1 将 x 设置为 100,而后 P2 将 x 增加到 101
  • 121。P2 将 x 增加到 11,而后 P1 将 x 设置为 x 乘以 x
  • 110。P2 将 x 从 10 修改到 11 的动作出现在 P1 两次访问 x 的值之间,这两次访问是为了求值表达式(* x x)
  • 11。P2 访问 x,而后 P1 将 x 设置为 100,而后 P2 又设置 x
  • 100。P1 访问 x(两次),而后 P2 将 x 设置为 11,而后 P1 又设置 x

下面分析上面这 5 种可能性,在本题中是否还能出现:

  • 101、121 所以可能出现,因为在执行过程中,P1、P2 完全独立,
  • 110 不可能再出现,因为 P1 与 P2 访问 x,是串行的
  • 11 可能再出现,因为 P1 中只有访问 x 与 P2 互斥,P1 中设置 x 是并行的
  • 100 可能再出现,原因同上