Skip to content

Commit 1509311

Browse files
committed
Add implementation of exercise 3-45
1 parent 5e92253 commit 1509311

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

README.org

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
习题完成情况:
2626
- 章节一: 43/46
2727
- 章节二: 88/97
28-
- 章节三: 44/82
28+
- 章节三: 45/82
2929
- 章节四: TODO
3030
- 章节五: TODO
3131
* 运行

chapter3/exercise3-45.org

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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+
- 两个进程都想尝试锁定剩下的资源,又不会释放已有的资源,死锁

0 commit comments

Comments
 (0)