Hazard Version
1 lock free算法的内存回收问题
hazard pointer算是比较通用也比较实用的内存回收机制,但是也有缺点,这里先介绍hazard pointer的做法,然后介绍一种改进方案。
2 hazard pointer
按hazardpointer的做法,一个节点要区分以下两种状态
- retired:这个节点被删掉。在retire之后开始的操作不可能访问到这个节点,但正在进行中的操作可能还会访问这个节点。
- reclaimed:这个节点的内存被回收,以后不能再访问
一个节点在retire之后并不能立即reclaim,因为正在进行中的操作可能还会访问这个节点。内存回收的本质就是判断retired的节点什么时候可以reclaim。
hazard pointer这种方案的做法就是通过维护一个hazardpointer的集合来判断一个节点是否还可能被访问:
- 如果一个节点已经retire,并且这个节点的指针没有出现在hazard pointer的集合中,那么就表示不会有任何线程会在未来访问它。
- 为了保证性质1,任何一个线程在访