2017-04-04 35 views
1

我是Haskell的新手。最近,我試圖通過Haskell創建一個遊戲。在那場比賽中,我使用Concurrent創建多個線程。如何在Haskell中創建共享變量?

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++(static double xxx)這樣的變量並且可以被任何函數訪問嗎?

+1

你可以給一些C++代碼說明你的意思是什麼「共享變量」在這裏,你打算如何使用它? – leftaroundabout

回答

1

通常,這些變量是在main或其他IO操作中創建的。

main = do 
    chan <- newEmptyMVar 
    startTimer <- newEmptyMVar 
    ... 
    forkIO $ userThread chan 
    forkIO $ processThread startTimer 
    ... 

有申報「全局變量」(主要是IORef S和MVar S)一些方法,但它們涉及不安全的功能,並且是最要避免的,特別是初學者。這樣的全局變量通常是不必要的,即使需要更多的輸入,通過傳遞幾個參數通常也更好。

在更高級的代碼中,可能會使用一個ReaderT r IO monad來減少簡單地通過MVar s的代碼的冗長度。但在開始時,傳遞變量很好。

+0

這會起作用,並會爲您提供您正在尋找的共享狀態,但如果您實際上不需要多個線程,它絕對是一種反模式。我認爲OP應該適應FP模式,因爲它們會產生更清晰,更習慣的代碼。使用'StateT GameState'或類似的'*'可以更好地傳遞MVars,並用'IO'污染你的整個代碼庫。 [非常相關的上一個問題](http://stackoverflow.com/questions/43215607/why-this-haskell-code-cannot-be-compiled) – Lazersmoke