據我瞭解,修改IORef
s爲非常快,所有它們涉及正在更新一個thunk指針。當然,讀者(即希望在他們的網頁上看到價值的人)需要花時間來評估這些thunk(如果作者不讀回結果,這可能會增加)。哈斯克爾:嘗試在平行`atomicModifyIORef`實施
我在想,開始實際上並行地評估IORef
上的修改thunk會很好,因爲在很多情況下,它們可能都必須在某個點上進行評估(顯然,這將打破無限的數據結構)。
所以我寫了下面的功能,具有相似的簽名atomicModifyIORef
:
atomicModifyIORefPar :: (NFData a) => IORef a -> (a -> (a, b)) -> IO b
atomicModifyIORefPar ioref f =
let
g olddata =
let (newdata, result) = f olddata in (newdata, (result, newdata))
in do
(result, newdata) <- atomicModifyIORef ioref g
force newdata `par` return result
這似乎是工作(test code here)。有什麼我在這裏做錯了嗎?還是有更好的方法來做到這一點?
編輯:第二次嘗試
通過Carl's answer below啓發。我們實際上將force newdata
存儲在IORef
中。這是一樣的newdata
無論如何,但表明我們希望保持force newdata
供以後運行,所以也沒有垃圾收集的火花。
atomicModifyIORefPar :: (NFData a) => IORef a -> (a -> (a, b)) -> IO b
atomicModifyIORefPar ioref f =
let
g olddata =
let
(newdata, result) = f olddata
newdata_forced = force newdata
in
(newdata_forced, (result, newdata_forced))
in do
(result, newdata_forced) <- atomicModifyIORef ioref g
newdata_forced `par` return result
我看不錯,但不知何故,我希望'取代'IORef' MVar'原子事務時。 – ephemient 2012-04-18 06:32:26
難道你不能定義IORef嚴格嗎?像IORef!Bla – 2012-04-18 14:22:48
@VagifVerdi:這會不會減慢編寫者,同時鎖定'IORef'直到修改函數被計算出來? – Clinton 2012-04-18 14:48:30