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 25
25
习题完成情况:
26
26
- 章节一: 43/46
27
27
- 章节二: 88/97
28
- - 章节三: 44 /82
28
+ - 章节三: 45 /82
29
29
- 章节四: TODO
30
30
- 章节五: TODO
31
31
* 运行
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