我可以确保Haskell执行原子IO吗?

时间:2010-06-05 20:32:23

标签: multithreading haskell io concurrency

我在haskell中有两个执行IO的线程。 (他们只打印)。如下所示:

thread1 :: IO ()
thread1 = putStrLn "One"

thread2 :: IO ()
thread2 = putStrLn "Two"

我目前正在获得以下结果:

OnTwoe
OTnweo

如何确保每个线程以原子方式完成其IO?

1 个答案:

答案 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打印出来。