请教一个多线程设计的面试题# JobHunting - 待字闺中w*e2013-11-19 08:111 楼设计一个支持concurrency的BST,该BST是类似于AVL和RBT的balanced,也就是说有些操作会rotation。请问谁有大概的思路?
w*e2013-11-19 08:113 楼details?怎么在tree里加入lock,lock怎么工作,然后改进improve concurrency,等等。【在 m*******n 的大作中提到】: critical section + AVL tree rotation.
p*32013-11-19 08:115 楼这个如果只是一般的插入和删除还好做,如果要rotate有可能一直rotate到root啊,整个结构都可能改变。觉得rotate的话是肯定要锁住整个树,两个插入或删除不能同时发生。如果读的话是不是可以用cpu支持的check and swap. 如果在确定iterate的子节点发生变化的时候就retry,retry超过一定次数就lock整个树,就是在rotate的的时候刚好正在travel那个rotate的节点的时候才可能miss一个数【在 w*******e 的大作中提到】: 设计一个支持concurrency的BST,该BST是类似于AVL和RBT的balanced,也就是说有些: 操作会rotation。: 请问谁有大概的思路?
p*22013-11-19 08:116 楼这题是大牛研习的EPI里的吧?【在 p*****3 的大作中提到】: : 这个如果只是一般的插入和删除还好做,如果要rotate有可能一直rotate到root啊,整: 个结构都可能改变。觉得rotate的话是肯定要锁住整个树,两个插入或删除不能同时发: 生。如果读的话是不是可以用cpu支持的check and swap. 如果在确定iterate的子节点: 发生变化的时候就retry,retry超过一定次数就lock整个树,就是在rotate的的时候刚: 好正在travel那个rotate的节点的时候才可能miss一个数
p*32013-11-19 08:117 楼java的concurrentHashMap有点像啊,网上有篇paper :http://www.cs.umanitoba.ca/~hacamero/Research/RBTreesKim.pdf【在 p*****2 的大作中提到】: : 这题是大牛研习的EPI里的吧?
z*e2013-11-19 08:119 楼就是用基本的读写锁但是不会把整个bst对象给锁住会把节点锁住,当然这里bst都是自己去实现所以锁node就好了【在 z**q 的大作中提到】: 用基本的读写锁思路行么? 不一定是最优的,但应付面试够了吧
f*42013-11-19 08:1110 楼锁node的话,树一大,并发一上去就别跑了 -_-struct Node{Node *left, *right;share_pointer data;};atomic root;查找的时候,把当前root和data一块返回,对data的操作需要比较返回的root和当前的atomic root;发现不一样,重新从atomic root查找。新增或者删除的时候,每次都新建一个root,新树可以复用旧树未修改节点,更新atomic root,旧树的未被新树使用的节点可以delay到下一次新增删除的时候删除。注意退出的时候也需要清除这些节点。
x*w2013-11-19 08:1111 楼要旋转的,怎么证明单锁node不会再两个或n个旋转同时发生的时候还consistent【在 z****e 的大作中提到】: 就是用基本的读写锁: 但是不会把整个bst对象给锁住: 会把节点锁住,当然这里bst都是自己去实现: 所以锁node就好了