Я могу удостовериться, что Haskell выполняет атомарный IO?

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

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

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

Я в настоящее время получаю результаты как следующее:

OnTwoe
OTnweo

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

23
задан Toymakerii 5 June 2010 в 20:32
поделиться

1 ответ

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

24
ответ дан 29 November 2019 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: