Haskell Thunk由于映射函数而导致内存泄漏

Haskell Thunk由于映射函数而导致内存泄漏,haskell,memory-leaks,Haskell,Memory Leaks,我正在编写一个多线程程序,它充分利用了MVAR;在本例中,我有一个线程定期更改mvar中的列表。不幸的是,有一个thunk内存泄漏。似乎有一个问题是“map id”(在实际程序中,我使用的不是id)函数泄漏。我只是找不到一个方法来避免这种情况——我一直在玩“seq”,但没有结果。修复泄漏的正确方法是什么 upgraderThread :: MVar [ChannelInfo] -> IO () upgraderThread chanMVar = forever job where

我正在编写一个多线程程序,它充分利用了MVAR;在本例中,我有一个线程定期更改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
升级读取::MVar[ChannelInfo]->IO()
upgraderThread chanMVar=永久性作业
哪里
工作=做
线程延迟1000

vlist再尝试几次后,这一项似乎有效:

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        
upgraderThread chanMVar=forever作业
哪里
工作=做
线程延迟1000

vlist除了空间泄漏外,早期版本还可能存在“时间泄漏”,因为放置在mvar中的未评估Thunk可能由接收线程而不是发送线程进行评估,这可能破坏任何预期的并行性。

您在
StricList
中使用的模式由
deepseq
概括;看见