Я пишу небольшой сервер уведомлений для отправки данных клиенту.Базовая архитектура выглядит примерно так (сокращенный псевдокод):
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
Спасибо за любые объяснения / понимание!