2011-07-08 37 views
8

Tôi đang viết một chương trình đa luồng, sử dụng khá nhiều mvars; trong trường hợp này, tôi có một chuỗi định kỳ thay đổi danh sách bên trong một mvar. Thật không may, có một rò rỉ bộ nhớ thunk. Có vẻ như là một vấn đề mà các 'id bản đồ' (trong chương trình thực sự tôi sử dụng một cái gì đó khác hơn là id) rò rỉ chức năng. Tôi chỉ không thể tìm ra cách để tránh điều đó - tôi đã chơi với 'seq' mà không có kết quả. Cách khắc phục rò rỉ đúng cách là gì?Rò rỉ bộ nhớ rác do chức năng bản đồ

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

Trả lời

4

Sau một vài cố gắng nhiều hơn, điều này dường như làm việc:

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   
+6

Mẫu bạn đang sử dụng trong 'strictList' được tổng quát bởi' deepseq'; xem http://hackage.haskell.org/packages/archive/deepseq/latest/doc/html/Control-DeepSeq.html – acfoltzer

4

Bên cạnh những rò rỉ không gian, các phiên bản trước đó cũng có thể có một "thời gian rò rỉ" trong đó các thunks unevaluated đặt vào mvar có thể được đánh giá bởi luồng nhận thay vì gửi đi, có thể phá hủy bất kỳ sự song song dự định nào.