Хаскелльский параллелизм и дескрипторы - PullRequest
0 голосов
/ 28 февраля 2011

Я пишу небольшой сервер уведомлений для отправки данных клиенту.Базовая архитектура выглядит примерно так (сокращенный псевдокод):

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 Ответ

4 голосов
/ 28 февраля 2011

Handle, поскольку , реализованный в GHC , уже является оболочкой MVar над базовым IODevice . Я не совсем понял, что вы делаете (не говоря уже о том, что это неясно, я немного болен, так что, возможно, я медлительный), но я предполагаю, что встроенные в поточную обработку GHC Handle спасут вас.

...