Haskell并发和Handles

时间:2011-02-27 22:11:36

标签: haskell concurrency handle

我正在编写一个通知服务器来将数据推送到客户端。基本架构看起来像这样(削减伪代码):

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和多线程newb

感谢您的任何解释/见解!

1 个答案:

答案 0 :(得分:4)

Handleimplemented in GHC,已经是基础IODevice的MVar。我不太明白你在做什么(不是说它不清楚,我有点不舒服,所以也许我很慢)但是我猜想GHC内置的Handle线程安全处理的GHC正在拯救你