您的位置:首页 > 其它

Art of Multiprocessor Programming 答案 ch14

2014-05-24 21:14 169 查看
163.

每个节点有相同的高度,并且是一次失败的查找。

164.

N * pow(p, n)

165.

166.

key可以不唯一,item唯一,因为add/remove/find都是以x(item)为参数。

所以find方法改为找到该节点 或者 找到该key值的末尾。

add方法也不用改变,因为add是从0层开始链入;如果2个add试图以同一个节点为尾节点加入新节点,则肯定有一个add会抢锁失败然后valid失败;如果以不同的节点为尾节点,表示某一个尾节点的next已经被改变,valid也会失败。如果一个节点链入了0层,则另一个的find会失败。

167.

这个方法不成功的可线性化点在 find返回 false。

这仍然是一个无锁算法。根据无锁的定义:it guarantees that infinitely often some method call finishes in a finite number of steps. 即无数次的方法调用中总有在有限步内完成的。如果无数次的方法调用都没有能够返回的调用,对应的case是 find总能找到并行add的可删除节点,但是总是标记失败且发现被删除节点已经被标记。即失败的调用者总是对应一个成功的将被删除节点标记并返回的调用。符合lockless的调用。

168.

这只是一种临时状态。



169.

求例子 。

170.

Add: 如图所示,find(x)将会得到succ = null;



Remove: 如图所示,如果这时候调用contain,将得到错误的结果;或者任何值 > 2的update操作,都会在find的时候在

retry --> sip = pred.next[level].compareAndSet(curr, succ, false, false) 死循环,因为2.layer1.marked = true。



171.

172.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: