Я узнаю о простых способах использования forkIO
и Mvar
из книги Марлоу: Параллельное и параллельное программирование в Haskell .В разделе MVar в качестве контейнера для общего состояния предоставляется следующий код:
-- Creates a new Map within an MVar
new :: IO PhoneBookState
new = do
m <- newMVar Map.empty
return (PhoneBookState m)
-- Inserts a Key, Value in the Map, locking the MVar
insert :: PhoneBookState -> Name -> PhoneNumber -> IO ()
insert (PhoneBookState m) name number = do
book <- takeMVar m
putMVar m (Map.insert name number book)
-- Retrieves the Map, locking the MVar briefly
lookup :: PhoneBookState -> Name -> IO (Maybe PhoneNumber)
lookup (PhoneBookState m) name = do
book <- takeMVar m
putMVar m book
return (Map.lookup name book)
Где PhoneBookState
содержит MVar (Map Name PhoneNumber)
.Моя проблема заключается в функции main
main = do
s <- new
sequence_ [ insert s ("name" ++ show n) (show n) | n <- [1..10000] ]
lookup s "name999" >>= print
lookup s "unknown" >>= print
Идея состоит в том, что оба поиска происходят одновременно, но в таком случае, не должно ли это быть что-то вроде
main = do
s <- new
sequence_ [ insert s ("name" ++ show n) (show n) | n <- [1..10000] ]
forkIO(lookup s "name999" >>= print)
lookup s "unknown" >>= print
Что такоеЯ скучаю?