【发布时间】:2012-04-24 08:06:03
【问题描述】:
我一直在问一些关于 Haskell 并发的问题,特别是 TVar,并且我对 TVar 的活锁感到担忧。
相反,我提出了这个解决方案。
(1) 将程序中的所有共享数据包装在一个数据结构中,并将其包装在IORef 中。
(2) 只需使用atomicModifyIORef 进行任何更改。
我相信这可以防止死锁和活锁(而 TVar 只能防止前者)。此外,因为atomicModifyIORef 只是将另一个 thunk 链接到一个链中(这是几个指针操作),所以这不是瓶颈。 所有对数据的实际操作都可以并行完成,只要它们不相互依赖即可。 Haskell 运行时系统会解决这个问题。
但是我觉得这太简单了。有没有我遗漏的“陷阱”?
【问题讨论】:
-
你为什么不直接使用STM?它更简单,效果也很好。
-
为什么STM比IORef简单? IORef 不用担心活锁,这让 IORef 更简单是吗?
-
我很确定 STM 不会导致活锁,但我可能弄错了。
-
@Gabriel Gonzalez:考虑需要 1 毫秒运行的事务每 100 毫秒连续运行一次。任何在该变量上运行需要 200 毫秒的事务将永远不会完成,因为它在提交时会不断发生冲突。它会不断重试,让服务器忙于做无用的工作。
-
"所有对数据的实际操作都可以并行完成,只要它们不相互依赖即可。"
标签: haskell concurrency shared-state ioref