我是Haskell的新手。最近,我试图用Haskell创建一个游戏。在那个游戏中,我使用Concurrent来创建多个线程。
data Msg = C Char | Time
forkIO $ userThread chan
forkIO $ processThread startTimer
userThread :: MVar Msg -> IO ()
userThread chan = forever $ do
c <- getChar
putMVar chan (C c)
showStr(show c)
processThread :: MVar Msg -> IO ()
processThread chan = forever $ do
threadDelay (startTimer)
putMVar chan (Time)
我不知道如何定义线程之间共享的任何其他数据。我可以定义一个像C ++(静态双xxx)的变量并被任何函数访问吗?
答案 0 :(得分:1)
通常,此类变量是在main
或其他IO操作中创建的。
main = do
chan <- newEmptyMVar
startTimer <- newEmptyMVar
...
forkIO $ userThread chan
forkIO $ processThread startTimer
...
有一些方法可以声明&#34;全局变量&#34; (主要是IORef
和MVar
s),但它们涉及不安全的功能,最好避免使用,特别是初学者。这样的全局变量大多是不必要的,并且通常更好地传递一些参数,即使它需要更多的输入。
在更高级的代码中,可以使用ReaderT r IO
monad来减少简单地传递MVar
的代码的详细程度。但在开始时,传递变量很好。