加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Haskell:TVar是如何工作的?

发布时间:2020-12-14 16:32:54 所属栏目:Java 来源:网络整理
导读:TVar如何运作?从我所看到的,它尝试在收到它们后立即运行所有事务,但是,事务完成使其他当前运行的事务无效,然后必须重新启动.这是TVar的工作原理吗? 如果是这种情况,如果每100ms发生1ms长的事务,这是否意味着需要200ms处理的事务永远不会完成? 解决方法 只
TVar如何运作?从我所看到的,它尝试在收到它们后立即运行所有事务,但是,事务完成使其他当前运行的事务无效,然后必须重新启动.这是TVar的工作原理吗?

如果是这种情况,如果每100ms发生1ms长的事务,这是否意味着需要200ms处理的事务永远不会完成?

解决方法

只要两个事务访问不同的TV,它们都可以同时提交而不会相互失效.

为了清楚说明事务失效的时候,让我们考虑以下场景:

>假设t :: TVar Int初始化为0,并在事务A开始时通过readTVar t读取.
>同时,在另一个线程中,启动事务B,其中执行writeTVar t 1.假设B在A之前提交.STM系统将检查是否存在任何不一致,并断定B此时提交是安全的,所以现在writeTVar t 1生效.
>然而,这会导致事务A无效,因为在A的开头读取了旧的0值(如果允许A提交,我们将违反原子性.)

关于Haskell的STM系统的原始论文[1](见第6.5节)回答了你的问题:

“Starvation is possible. For example,a transaction that runs for
a very long time may repeatedly conflict with shorter transactions.
We think that starvation is unlikely to occur in practice,but we
cannot tell without further experience.”

[1] Tim Harris,Simon Marlow,Simon Peyton Jones和Maurice Herlihy. ACM 2005年并行编程原理与实践会议(PPoPP’05).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读