Могу ли я убедиться, что Haskell выполняет атомарный ввод-вывод? - PullRequest
23 голосов
/ 06 июня 2010

У меня есть два потока в haskell, которые выполняют IO.(Они печатают только).Примерно так:

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

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

В настоящее время я получаю результаты, подобные следующим:

OnTwoe
OTnweo

Как я могу гарантировать, что каждый поток завершает свой ввод-вывод атомарно?

1 Ответ

24 голосов
/ 06 июня 2010

Используйте переменную синхронизации для обеспечения атомарного доступа к ресурсу. Простой способ с 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, и отправка сообщений на печать через Чан.

...