我正在编写一个通知服务器来将数据推送到客户端。基本架构看起来像这样(削减伪代码):
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
感谢您的任何解释/见解!
答案 0 :(得分:4)
Handle
,implemented in GHC,已经是基础IODevice的MVar。我不太明白你在做什么(不是说它不清楚,我有点不舒服,所以也许我很慢)但是我猜想GHC内置的Handle
线程安全处理的GHC正在拯救你