У меня есть два потока в 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.