繁体   English   中英

嵌套在orElse中的STM事务中的验证

[英]Validation in STM transactions nested with orElse

该评论页面描述了GHC中STM的许多详细信息,但我想在几点上保持清晰。

首先 ,当父级中访问的变量发生更改时,嵌套事务是否无效?

例如我们在线程A

takeTMVar a `orElse` takeTMVar b `orElse` takeTMVar c

假设当A执行嵌套事务takeTMVar b ,另一个线程B执行putTMVar a () ; 线程A可以成功完成其嵌套事务,还是使其无效(这会使我感到错误)?

我想理解的第二点是,但我不介意放心:在上述针对A所述的整个顶级交易被重试并最终阻塞的情况下,当ab任何a被唤醒时, A是否被唤醒是正确的吗? ,或c变化?

最后,作为奖励 ,做上述变化事务的语义,如果我们(或库的作者)改变orElseinfixr

我认为“嵌套”是不恰当的描述方式。 这是三个备用交易; 没有一个嵌套在另一个内部。 特别是,这三种情况中的一种恰好会发生并被落实-但是发生的哪一种并不确定。 这句话足以回答所有三个问题,但是请确保为每个问题仔细说一遍:

  1. 没有保证。 也许takeTMVar b将完成并提交; 否则它将被抢占,而takeTMVar a将被唤醒并完成。 但是他们不会全部完成,这是肯定的。

  2. 是的,这是正确的:所有三个TMVar都可以唤醒该线程。

  3. 语义不会改变:只要其中几个可以提交,最左边的一个就会提交。 (特别是描述STM的论文说,“ orElse函数遵循有用的定律:它是关联的,并且具有单元retry 。”。)

  4. (摘自您提出的问题)链接的论文第8页STM的语义确实保证了最成功的事务成功的事务。 所以:如果线程A正在执行takeTMVar b (但尚未提交)和线程B执行,并承诺一个写a ,并没有什么事情发生后 ,你可以肯定的是线程A将重新启动,并返回来自新写入的值a “此后什么也没有发生”部分很重要:语义对发生的事情作出了承诺,但对实现的实现方式不做承诺。 所以,如果说,另一个线程从拿了a立即(以便takeTMvar a仍然在不断retry ),足够聪明的实现是允许注意到这一点,而不是重新启动线程A从交易的开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM