以下是两个进程 P1 、 P2 同时对互斥元进行非原子性的 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! 的原子性,所以 P1 和 P2 可以同时对互斥元进行设置,在执行的最后, P1 和 P2 都获取了互斥元,这明显是错误的。