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和多線程福利局
感謝任何解釋/見解!
別擔心,我確定我沒有做最好的工作來說明我正在做的事情 - 基本上我很好奇hPutStrLn和hGetLine如何在同一個Handle上由不同的線程「同時」調用。你回答了我笨拙的問題。謝謝! – 2011-02-27 23:51:16