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