関数型言語の勉強にSICPを読もう - (45) 3章 - 標準部品化力、オブジェクトおよび状態 (181-185ページ)
問題3.41
Benの心配は杞憂である。
直列化しない場合、例えば withdraw の中で balance が set! される前後の間に、balanceを取得できるようになってしまうが読み取りだけなので問題ない。
問題3.42
安全であると思う。
ツッコミ募集。
問題3.43
直列変換器を輸出する→serializer を export するの方が自分にとってはイメージしやすいw。
まぁそれはそれとして略。
問題3.44
Louisは間違っている。
今回やりたいことは
- 口座Aからwithdrawする
- 口座Bにdepositする
ことである。
それぞれの処理は atomic であるから何の問題もない。
もちろんエラー処理はないと仮定している。
直列変換器の実装
atomicな test-and-set!を利用しての直列変換機の実装についてのお話。
mutex aquireはretry時にビジーウェイトになっているけど、OSのサポートがあればCPUにやさしい実装にできる。
もちろんMonaにもMutex機構がありますよと何気なく宣伝。
without-interrruptsを利用してtest-and-set!を実装するのがまあ簡単という例も載っています。
ところで時間切片という用語が良く分からないので原書をあたってみた。
訳:「こういう場合はtest-and-set!はテストと設定の間で時間切片が変わらないようにすることでうまくいく。」
原書:「In that case, test-and-set! can work by disabling time slicing during the testing and setting」
ちょっと訳が古いので超訳すると
「こういう場合はtest-and-set!は、test と set! を実行する間に時が進まないようにすることでうまくいく。」かな。