Утечка памяти Thunk в результате функции карты - PullRequest
8 голосов
/ 09 июля 2011

Я пишу многопоточную программу, которая использует mvars;в этом случае у меня есть поток, который периодически меняет список внутри mvar.К сожалению, есть утечка памяти.Кажется, есть проблема, что функция «id карты» (в реальной программе я использую что-то еще, кроме id) не работаетЯ просто не могу найти способ избежать этого - я играл с seq безрезультатно.Как правильно исправить утечку?

upgraderThread :: MVar [ChannelInfo] -> IO ()
upgraderThread chanMVar = forever job
    where
        job = do
            threadDelay 1000
            vlist <- takeMVar chanMVar
            let reslist = map id vlist
            putMVar chanMVar reslist

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Помимо утечки пространства, более ранняя версия также может иметь «утечку времени» в том смысле, что неоцененные thunks, помещенные в mvar, могут оцениваться принимающим потоком вместо отправляющего, что может разрушить любой предполагаемый параллелизм.

4 голосов
/ 09 июля 2011

После еще нескольких попыток, похоже, эта работает:

upgraderThread chanMVar = forever job
    where
        job = do
            threadDelay 1000
            vlist <- takeMVar chanMVar
            let !reslist = strictList $ map id vlist
            putMVar chanMVar reslist

        strictList xs = if all p xs then xs else []
            where p x = x `seq` True        
...