Skip to main content
 首页 » 编程设计

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

2025年01月19日40cyq1162

我在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 打印出来。