読者です 読者をやめる 読者になる 読者になる

SICPゼミ第25回

練習問題3.48

ループができないから。

serialized-exchange の実装例

;今までの serialized-exchange と同じやつ
(define (serialized-exchange account1 account2)
  (let (( serializer1 (account1 'serializer ))
        (serializer2 (account2 'serializer )))
    (( serializer1 (serializer2 exchange ))
     account1
     account2 )))


(define (serialized-exchange-renewal account1 account2)
  (let ((id1 (get-ID account1))
        (id2 (get-ID account2)))
    (if (> id1 id2)
        (serialized-exchange account2 accoun1)
        (serialized-exchange account1 account2))))

by tube

練習問題3.49

極論を言ってしまえば、使う可能性のあるリソースを全て列挙してID順にロックするというようにしてしまえば、(並列化もくそもないが) デッドロックは回避できる。
そうでなく、確実に必要なリソースのみをロックするようにすれば、条件分岐によってID順に逆らったロックの順番ができてしまい、デッドロックがおきうる。具体例は特に面白くもないので割愛。