练习 3.46

以下是两个进程 P1P2 同时对互斥元进行非原子性的 test-and-set! 操作造成错误的步骤:

  |   P1                             mutex                             P2
  |   |                                                                 |
  |   |                                                                 |
  |   |                                                                 |
  |   +----------------------------> false <----------------------------+
  |    test-and-set!                                       test-and-set!
  |          |                                                   |
  |          |                                                   |
  |          +--------------------->  true <---------------------+
  |    (begin (set-car! cell true)           (begin (set-car! cell true)
  |           false)                                false)
  |
  v
time

因为没有保证 test-and-set! 的原子性,所以 P1P2 可以同时对互斥元进行设置,在执行的最后, P1P2 都获取了互斥元,这明显是错误的。

讨论

blog comments powered by Disqus