File tree Expand file tree Collapse file tree 2 files changed +39
-1
lines changed
Expand file tree Collapse file tree 2 files changed +39
-1
lines changed Original file line number Diff line number Diff line change 2525 习题完成情况:
2626 - 章节一: 43/46
2727 - 章节二: 88/97
28- - 章节三: 44 /82
28+ - 章节三: 45 /82
2929 - 章节四: TODO
3030 - 章节五: TODO
3131* 运行
Original file line number Diff line number Diff line change 1+ #+LATEX_CLASS: ramsay-org-article
2+ #+LATEX_CLASS_OPTIONS: [oneside,A4paper,12pt]
3+ #+AUTHOR: Ramsay Leung
4+ 5+ #+DATE: 2025-07-23 Wed 22:11
6+ Louis 的方案会导致死锁
7+
8+ #+begin_src scheme
9+ (define (make-account-and-serializer balance)
10+ ;; ... withdraw and deposit definitions ...
11+ (let ((balance-serializer (make-serializer)))
12+ (define (dispatch m)
13+ (cond ((eq? m 'withdraw)
14+ (balance-serializer withdraw)) ; serialized!
15+ ((eq? m 'deposit)
16+ (balance-serializer deposit)) ; serialized!
17+ ((eq? m 'balance) balance)
18+ ((eq? m 'serializer) balance-serializer) ; Also exported
19+ (else (error "Unknown request" m))))
20+ dispatch))
21+ #+end_src
22+
23+ 再来看下 =serialized-exchange= 的实现:
24+
25+ #+begin_src scheme
26+ (define (serialized-exchange account1 account2)
27+ (let ((serializer1 (account1 'serializer))
28+ (serializer2 (account2 'serializer)))
29+ ((serializer1 (serializer2 exchange))
30+ account1 account2)))
31+ #+end_src
32+
33+ 假如有两个进程并发交换账户A与账户B:
34+ - 进程1: =(serialized-exchange A B)=
35+ - 进程2: =(serialized-exchange B A)=
36+ - 进程1获取到账户A的锁,尝试获取账户B的锁
37+ - 进程2获取到账户B的锁,尝试获取账户A的锁
38+ - 两个进程都想尝试锁定剩下的资源,又不会释放已有的资源,死锁
You can’t perform that action at this time.
0 commit comments