我在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"
另一种设计是有一个专用的工作线程来执行所有
putStrLns
,然后您发送消息以通过 Chan 打印出来。