2011-02-27 73 views
0

我正在寫一個通知服務器來將數據推送到客戶端。基本結構看起來是這樣的(相比下來僞代碼):Haskell併發性和句柄

acceptConnections sock = forever $ do 
    connection <- accept sock 
    forkIO (handleConnection connection) 

handleConnection connection = do 
    connectionHandle <- socketToHandle connection ReadWriteMode 
    handleMessage connectionHandle 
    hClose connectionHandle 

handleMessage connectionHandle = forever $ do 
    message <- hGetLine connectionHandle 
    if shouldPushMessage message 
     then hPutStrLn targetConnection message 
     else return() 

凡targetConnection(中的handleMessage)是從一個單獨的連接,並掛的handleMessage在不同的線程在等待被填滿其緩衝區。我認爲這會導致一個問題,因爲我有2個線程訪問相同的句柄。所以,我的問題是,爲什麼這不是問題?或者是,我只是沒有看到它變成了一個問題呢?在我的實際應用中,當我抓取targetConnection時,我通過一個通過MVar訪問的地圖來完成這項工作,但在hGetLine調用中不能安全地訪問它。

免責聲明:我是一個完整的Haskell和多線程福利局

感謝任何解釋/見解!

回答

4

Handle,作爲implemented in GHC,已經是一個MVar包裝在底層IODevice。我沒有完全明白你在做什麼(不是說它不清楚,我有點不舒服,所以也許我很慢),但我猜測在線程安全處理Handle中構建的GHC正在節省你。

+1

別擔心,我確定我沒有做最好的工作來說明我正在做的事情 - 基本上我很好奇hPutStrLn和hGetLine如何在同一個Handle上由不同的線程「同時」調用。你回答了我笨拙的問題。謝謝! – 2011-02-27 23:51:16