我在Haskell中有两个执行IO的线程。(它们仅打印)。类似以下内容:
thread1 :: IO ()
thread1 = putStrLn "One"
thread2 :: IO ()
thread2 = putStrLn "Two"
我目前得到的结果如下:
OnTwoe
OTnweo
如何确保每个线程原子地完成其IO操作?
我在Haskell中有两个执行IO的线程。(它们仅打印)。类似以下内容:
thread1 :: IO ()
thread1 = putStrLn "One"
thread2 :: IO ()
thread2 = putStrLn "Two"
我目前得到的结果如下:
OnTwoe
OTnweo
如何确保每个线程原子地完成其IO操作?
使用同步变量来确保对资源的原子访问。 一种简单的方法是使用 MVar:
main = do
lock <- newMVar ()
forkIO $ ... lock
forkIO $ ... lock
现在,为了不交错地执行IO操作,每个线程都会获取锁:
thread1 lock = do
withMVar lock $ \_ -> putStrLn "foo"
thread2 lock = do
withMVar lock $ \_ -> putStrLn "bar"
一个备选的设计方案是,有一个专门的工作线程来执行所有的putStrLn
操作,你可以通过Chan发送消息以便打印输出。
monad-parallel
包,它能够分叉不是IO的Monad。我无法为非IO Monad使用mVars。 - CMCDragonkaiwithMVar
的第二个参数应该是一个函数,而不仅仅是putStrLn "..."
。 - CMCDragonkai