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 和多线程新手
感谢您的任何解释/见解!
Handle,正如在 GHC 中实现的那样,已经是一个包装在底层IODevice 上的 MVar 。我不太明白你在做什么(不是说不清楚,我有点病所以也许我很慢)但我猜测内置于线程安全处理的 GHCHandle正在拯救你。
| 归档时间: |
|
| 查看次数: |
498 次 |
| 最近记录: |