What have you found for these years?

2011-06-23

STM and dining philosophers

昨天(應該沒記錯吧?)像是發神經似的,半夜在用 STM 模擬
dining philosophers... 現在則是像是發神經似的,半夜在
寫這篇。反正我就隨便講講,大家就隨便聽聽,愈來愈習慣亂講話了...

起由主要是在 twitter 上討論 enumerator, 然後講到 STM, 發現
我根本不清楚 STM 在用什麼,雖然概念看過很多次了。所以就在查
haskell 上用 STM 是什麼樣子。然後找到這篇 blog post 還滿可(容易)
讀的:
Some examples of Software Transactional Memory in Haskell

先整個看完一次,然後仿他的概念照寫一次,結果就是 philosopher.hs

不確定這邊是否可以用 writer monad (thus transformer),
不過既然這樣看起來還算乾淨,一時也沒太多時間琢磨(可我現在在幹嘛?),
大概就先寫到這樣,日後再看看要怎麼繼續玩相關的東西。

怎麼說,寫完這個其實觀察到不少東西:

* 沒加 threadDelay 時,永遠只有零號哲學家吃吃想想想想吃吃。
這不禁讓我懷疑 forkIO 到底在做什麼..? 真的有 fork 嗎?真正的
thread 應該不是這樣運作才對?也看到有人說,用 --threaded
去 compile 的話,POSIX sleep 反倒變得沒有效果。或許是好事,
本來我們就不該倚賴某種 thread 的實作。

* 沒加印東西到螢幕上的話,可還真不知道自己寫對寫錯... 我很快
就把最基本的東西寫完了,並驚訝自己對於 type 敏感度比過去高
很多。常常想也沒想,就照著 type 填上去就對了,很快就 type
check 了。看到 type check 很高興,但抓抓腦袋,然後咧?
到底對不對呀... orz

* 我想我比較能夠理解 IO monad 其實也沒那麼黑魔法了。就我
目前所知與觀察,STM monad 就某方面而言跟 IO monad 有點像。
講得白痴一點,就是既然有比較像的東西了,他也就沒那麼「特別」了...

講得長一點的話,大概是這樣。把 IO monad 想像成一種異世界,
外界的東西可以進去,但一旦進入了異世界,就永遠無法回到原本的
世界。如果要再跟進入異世界的東西互動的話,唯一方法就是,自己
也進到那個異世界裡。同流合污啦...

STM monad 目前看起來也有點像這樣。我們可以任意組合這些
context (monad), 想像成一種運算上的結構,想像成這些算式上,
有一個未知數,而填上這個未知數,才能得到原本想要的結果。

在 IO monad 中,填上未知數的動作像是跟 main 打交道。而在 STM
monad 中,則是透過 atomically 將 STM monad 轉換成 IO monad.

在 STM 異世界中,有一條唯一可以逃離的道路 -- atomically.
然而這條唯一的出口,卻是通向 IO 異世界... 還是回不到現實。

要有所謂的「執行」,或是說同流合污,最終還是要回到 IO...
說來說去像是地獄似的 XD IO 18 層,STM 17 層...

欲知 16 回,請待下回分曉(誤)

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0