MonadResource中的资源释放顺序

时间:2014-03-18 11:12:11

标签: haskell monad-transformers

MonadResource能够跟踪多个资源。有时这些资源的解除分配顺序很重要。请考虑以下代码:

allocator1 = putStrLn "allocator1"
deallocator1 = putStrLn "deallocator1"

allocator2 = putStrLn "allocator2"
deallocator2 = putStrLn "deallocator2"

accessResource = const $ putStrLn "accessResource"

resourceTest :: MonadResource m => m ()
resourceTest = do
    (_, resource1) <- allocate allocator1 $ const deallocator1
    (_, resource2) <- allocate allocator2 $ const $ accessResource resource1 >> deallocator2
    return ()

main = runResourceT resourceTest 

这里我从resource2清理操作访问resource1,所以我希望resource1将始终在resource1之后被释放,否则代码将是不正确的。至少在目前的实施中这是事实。如果我运行代码,我会得到:

allocator1
allocator2
accessResource
deallocator2
deallocator1

MonadResource是否始终隔离先前分配的资源(因此可从以后的清理操作中访问)将在以后解除分配,或者解除分配顺序是否是特定于实现的?如果具体实施,保证特定解除分配顺序的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

从版本0.3.2.1开始,取消分配始终处于LIFO顺序。这已更改为响应issue #46,其中包含更多信息。换句话说,您可以依赖deallocator2始终在deallocator1之前运行。