我编写了以下函数,我认为应该以原子方式执行 IO(只要其他人都使用相同的函数MVar
)。
atomicIO :: MVar () -> IO a -> IO a
atomicIO mvar io =
do
takeMVar mvar
result <- io
putMVar mvar ()
return result
另外,据我了解,Haskell IO 的某些部分是惰性的(例如IORef
s),因此无需实际执行本节中的操作。它可以只返回一个“thunk”(这是正确的词吗?),其中列出了需要完成的任务。
这个想法是,关键部分(即单线程部分)应该很快。
但是,假设我正在写信给IORef
s,并且我希望 Haskell 立即开始计算结果,所以它可以在需要时执行。但是就像我之前说的,当我们持有锁时,我不想被锁在关键部分MVar
。
所以我想过这样做:
result <- io `par` io
或这个
return result `par` result
或这个
result `par` return result
但我不确定这是否有效。其中一个是正确的方法,还是有另一种方法?(我对后两者的担忧是IO ()
行动,因为我认为并行评估()
实际上并没有做任何工作)。