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

Toy*_*rii 23 io concurrency multithreading haskell

我在haskell中有两个执行IO的线程.(他们只打印).类似于以下内容:

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

thread2 :: IO ()
thread2 = putStrLn "Two"
Run Code Online (Sandbox Code Playgroud)

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

OnTwoe
OTnweo
Run Code Online (Sandbox Code Playgroud)

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

Don*_*art 24

使用同步变量确保对资源的原子访问.一个简单的方法是使用MVar:

main = do
   lock <- newMVar ()
   forkIO $ ... lock 
   forkIO $ ... lock
Run Code Online (Sandbox Code Playgroud)

现在,为了在没有交错的情况下执行IO,每个线程都会获取锁:

thread1 lock = do
      withMVar lock $ \_ -> putStrLn "foo"

thread2 lock = do
      withMVar lock $ \_ -> putStrLn "bar"
Run Code Online (Sandbox Code Playgroud)

另一种设计是拥有一个专用的工作线程来完成所有操作putStrLns,然后发送消息以通过Chan打印出来.

  • 作为练习:尝试使用事务内存来编写此命令以命令访问资源. (4认同)
  • 我会试一试!我也改变了:withMVar lock $(\ _ - > putStrLn"bar") (2认同)