我写了下面这个函数,我相信它应该能够原子性地执行IO操作(只要其他人也在使用同一个MVar变量)。
atomicIO :: MVar () -> IO a -> IO a
atomicIO mvar io =
do
takeMVar mvar
result <- io
putMVar mvar ()
return result
此外,据我了解,Haskell IO 的某些部分是惰性的(例如
IORef
),因此在本节中实际执行操作并不必要。它可以返回一个“thunk”(这个词是正确的吗?),其中列出了需要完成的任务。想法是,关键部分(即单线程部分)应该相当快。
然而,假设我正在写入
IORef
,并且我希望 Haskell 立即开始计算结果,以便在需要时准备好使用。但正如我之前所说,当我们持有 MVar
锁定时,我不想被锁定在关键部分。因此,我考虑了这个方法:
result <- io `par` io
或者这个
return result `par` result
或者这个
result `par` return result
但我不确定这是否能胜任。其中哪种方法是正确的,还是有其他的方法?(我对后两种方法的担忧在于IO()
操作,因为我认为并行计算()
并没有真正做任何工作)。
modifyIORef
的方法,或者我需要先进行单独的readIORef
,然后再进行writeIORef
? - Clinton