Haskell 并发和句柄

Dre*_*ins 1 concurrency haskell 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 () 
Run Code Online (Sandbox Code Playgroud)

其中 targetConnection(在 handleMessage 中)来自一个单独的连接,并在不同的线程中挂起 handleMessage,等待其缓冲区被填充。我认为这会导致问题,因为我有 2 个线程访问同一个句柄。所以,我的问题是,为什么这不是问题?或者是这样,我只是还没有看到它变成一个问题?在我的实际应用程序中,当我获取 targetConnection 时,我是通过我通过 MVar 访问的地图来实现的,但是在 hGetLine 调用中并没有安全地访问它。

免责声明:我是一个完整的 Haskell 和多线程新手

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

Tho*_*son 5

Handle,正如在 GHC 中实现的那样,已经是一个包装在底层IODevice 上的 MVar 。我不太明白你在做什么(不是说不清楚,我有点病所以也许我很慢)但我猜测内置于线程安全处理的 GHCHandle正在拯救你。