Подтвердить что ты не робот

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

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

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

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

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

OnTwoe
OTnweo

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

4b9b3361

Ответ 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.