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

dsi*_*ign 8 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
Run Code Online (Sandbox Code Playgroud)

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

chi*_*chi 9

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

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

  • 我发现值得指出的是,在这种情况下,并不是单一的导弹发射会产生严重的国际副作用 - 当交易被重试多次时你必须要注意的是735核射击.;) (4认同)