在STM交叉中使用痕迹是否安全?

时间:2015-06-01 08:51:01

标签: haskell stm

由于某种原因,我有一个无限期失败的事务,我想在里面使用跟踪指令。例如,要在执行此片段中的事务之前打印MVar的状态:

    data_out <- atomically $ do 
        rtg_state <- takeTMVar ready_to_go 
        JobDescr hashid url <- T.readTBChan next_job_descr
        case rtg_state of 
            Ready_RTG n -> do
                putTMVar ready_to_go $ Processing_RTG n
                putTMVar start_harvester_browser hashid
                putTMVar next_test_url_to_check_chan  hashid
                putTMVar next_harvest_url hashid
                return (n,hashid,url)
            _ -> retry

这是否会使程序出现段错误或错过行为?

1 个答案:

答案 0 :(得分:9)

只要您使用trace进行调试,就应该没问题。作为一般规则,假设在程序的最终生产就绪版本中没有trace

您永远不会从trace观察到段错误。它的“不安全”源于它在纯代码中注入可观察的效果。例如,在STM中,当事务重试时,假定其效果被回滚。如果trace用于向用户发送消息,则无法回滚。如果trace的输出触发导弹发射,你将不得不处理国际副作用。如果trace只是通过“FYI,代码正在执行X”向开发人员发出信号,那么这不是程序核心逻辑的一部分,并且非常好。