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