【发布时间】:2014-04-02 03:42:48
【问题描述】:
在 STM 上阅读 Bartosz Milewski 的精彩 blog post,我很高兴看到以下内容:
但要考虑一个重要的事实:STM 的粒度非常细。为了 例如,当您将项目插入树中时,STM 事务只会锁定您实际修改的节点。 STM 将轻松击败每个整体使用一个全局锁的解决方案 树。
但是,据我了解,这种行为不是自动的,是吗?如果我使用TVar (Map k a),它不会在整个地图上充当单个全局锁吗?为了获得这种细粒度行为的好处,我(或某人)必须在内部实现包含TVars 的地图替换(例如TMap),对吗?
这似乎是一个显而易见的问题,但在阅读 STM 实现时,我对读取 TVars 和读取内存位置感到困惑。我只是想确保我做对了!
Bartosz 进一步说:
每个节点的手动锁定很难正确实现,因为 死锁的风险。
据我所知,与 STM 的不同之处在于,虽然 STM 实现实际上使用了手动锁定解决方案可能使用的锁,但锁的实际获取和释放是由运行时处理的,而不是程序员 - 正确?
【问题讨论】:
-
这取决于实现,但有许多无锁方式来实现 STM(例如原子比较和交换)。至于你的第一个问题,是的,你需要
TVars 的地图,而不是TVar (Map k v)。 -
@ThomasM.DuBuisson 对此表示感谢。你的意思是我实际上可以有一个细粒度的
Map,还是我需要完全重新实现Map才能在内部使用TVars? -
另外,我刚刚了解到“获取”实际上是一个词。幸运的猜测。
-
您可以简单地拥有一个值为
TVars 的法线贴图。更具体地说,Map k (TVar v).