我正在编写一个多线程程序,它充分利用了mvar;在本例中,我有一个在mvar中定期更改list的线程。不幸的是,有一个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发布于 2011-07-09 06:11:23
经过几次尝试,这个方法似乎起作用了:
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 发布于 2011-07-12 23:42:56
除了空间泄漏之外,早期版本还可能存在“时间泄漏”,因为放置在mvar中的未计算的thunk可能会由接收线程而不是发送线程进行计算,这可能会破坏任何预期的并行性。
https://stackoverflow.com/questions/6630782
复制相似问题