我在haskell中有两个执行IO的线程。 (他们只打印)。如下所示:
thread1 :: IO ()
thread1 = putStrLn "One"
thread2 :: IO ()
thread2 = putStrLn "Two"
我目前正在获得以下结果:
OnTwoe
OTnweo
如何确保每个线程以原子方式完成其IO?
答案 0 :(得分:24)
使用同步变量确保对资源的原子访问。一个简单的方法是使用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打印出来。