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).

dawei

【声明】:淮南站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。