编写STM软件时是否还需要逻辑锁定?

时间:2013-06-09 10:08:01

标签: stm

我没有写任何与STM(软件事务内存)相关的内容,只读取了网络上的信息。所以这只是一个虚构的例子

假设我们有一个FIFO缓冲区,其中包含最多允许的项目。因此,我们填充数组直到达到最大项目,并在没有剩余项目时移动它。使用传统方法,我不仅会锁定实际的移位和附加,还会锁定检查是否达到最大值的条件读取。我必须这样做,否则两个线程可以模拟决定剩下的唯一项目是针对他们的。所以我在这里有一种与写冲突没有直接关系的逻辑锁。

使用STM我假设两个线程都可以决定该项目是否已离开并尝试填充最后一项。但是由于在检测到另一个线程修改了相同的内存之后在一个线程(或两者)中触发了回滚,因此保持了正确性。乐观情景说,有时候其中一个线程最终会增加元素数量,另一个线程最终会进入其他分支(FIFO移位)。但是我也看到这里有一个无限循环的可能性,如果两个人都注意到最后一个项目被留下并试图填补它。

在编写与STM相关的软件时,我还需要添加“逻辑”锁吗?

1 个答案:

答案 0 :(得分:1)

您不需要任何逻辑锁定 - 当然不适用于这种情况。

两个线程不可能“注意”一个插槽仍然是空闲的。一个线程被回滚的唯一方法是,如果另一个线程已成功提交 - 意味着最后一个槽已被填充。

保证永远不会发生死锁,因为锁定仅在提交阶段发生,到那时我们确切地知道要锁定什么,并且可以按照一致的顺序获取锁定。保证Livelock永远不会发生,因为一个事务只能回滚,因为另一个事务成功提交。因此,两笔交易不可能永远地相互阻止。

理论上可能的 是饥饿。一个特别不幸的交易可以回滚无限时间。只有在无限数量的冲突事务成功提交时才会发生这种情况。因此,在全球范围内,系统必须取得进展,但在本地,一个特定的交易可能会陷入困境。

在实践中,可能发生这种情况的唯一方法是,如果您正在运行无限的短交易流,然后您启动一个非常长的交易,从而永远无法完成。