由于映射功能导致Thunk内存泄漏

ond*_*dra 8 haskell memory-leaks

我正在编写一个多线程程序,它充分利用了mvars; 在这种情况下,我有一个线程,周期性地更改mvar内的列表.不幸的是,有一个thunk内存泄漏.似乎有一种问题是'map 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
Run Code Online (Sandbox Code Playgroud)

ond*_*dra 3

经过几次尝试,这个似乎有效:

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        
Run Code Online (Sandbox Code Playgroud)

  • 您在“strictList”中使用的模式由“deepseq”概括;请参阅http://hackage.haskell.org/packages/archive/deepseq/latest/doc/html/Control-DeepSeq.html (6认同)