gpt4 book ai didi

haskell - 与 orElse 嵌套的 STM 事务中的验证

转载 作者:行者123 更新时间:2023-12-04 19:07:23 27 4
gpt4 key购买 nike

This commentary page描述了STM的很多细节在 GHC 中,但我想澄清几点。

第一 , 当父级中访问的变量发生变化时,嵌套事务是否失效?

例如,我们在线程 A 中有:

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

说虽然 A正在执行嵌套事务 takeTMVar b , 另一个线程 BputTMVar a () ;可以线程 A成功完成其嵌套事务,还是无效(这会让我觉得是错误的)?

A 第二个我认为我理解但不介意保证的一点:在上述针对 A 的整个顶级交易的情况下重试并最终阻止, A 是否正确?当 a 中的任何一个时都会被唤醒, b , 或 c改变?

最后作为 奖金 , 如果我们(或库作者)更改 orElse,请更改上述事务的语义至 infixr ?

最佳答案

我不认为“嵌套”是描述这一点的正确术语。这是三个备用交易; none 嵌套在另一个中。特别是,这三个中的一个将要发生并被提交——但哪个发生是不确定的。这一句话应该足以回答所有三个问题,但为了确定,让我们仔细说一下:

  • 没有保证。也许 takeTMVar b将完成并提交;或者它可能会被抢占和takeTMVar a将被唤醒并完成。但他们不会都完成,这是肯定的。
  • 是的,没错:所有三个 TMVar s 可以唤醒这个线程。
  • 语义不会改变:只要其中几个可以提交,最左边的就会提交。 (特别是,the paper describing STM 说,“orElse 函数遵循有用的法则:它是结合的并且具有单位 retry。”。)
  • (来自您在评论中的问题)链接论文第 8 页上 STM 的语义确实保证最左边的成功交易是成功的交易。所以:如果线程 A正在执行 takeTMVar b (但尚未提交)和线程 B执行并提交写入 a ,之后没有其他事情发生,您可以确定线程 A将重新启动并从 a 返回新写入的值. “之后没有其他事情发生”部分很重要:语义对发生的事情做出了 promise ,而不是关于实现如何实现它;因此,如果说,另一个线程来自 a立即(这样 takeTMvar a 仍然会去 retry ),一个足够聪明的实现被允许注意到这一点,而不是重新启动线程 A从交易开始。
  • 关于haskell - 与 orElse 嵌套的 STM 事务中的验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21193484/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com