+ -
当前位置:首页 → 问答吧 → 链表锁的问题

链表锁的问题

时间:2010-11-17

来源:互联网

一个hlist链表,采用头插法 hlist_add_head_rcu.
那么在遍历这个链表和头插节点的时候,还需要用锁吗?
个人感觉不需要用锁,不知道是否正确啊?
还有用hlist_add_head和hlist_add_head_rcu在这种情况下会有不同吗?

作者: 瀚海书香   发布时间: 2010-11-17

conntrack 表用的就是 hlist,可以参考一下。

遍历这个链表的时候,应该是需要加锁的。不然这个链表正在被执行写动作,你又去读

作者: Godbach   发布时间: 2010-11-17

这个需要看rcu锁相关的资料。按理说使用rcu锁 在遍历的时候 只需要标记rcu_read_lock就行了

作者: funix_zjx   发布时间: 2010-11-17

本帖最后由 瀚海书香 于 2010-11-17 11:33 编辑

回复 Godbach
如果链表只会用头插法添加节点和遍历节点。我感觉遍历的时候应该不需要用锁的。但是好像内核里都用了rcu_read_lock了

作者: 瀚海书香   发布时间: 2010-11-17



QUOTE:
回复  Godbach
如果链表只会用头插法添加节点和遍历节点。我感觉遍历的时候应该不需要用锁的。
瀚海书香 发表于 2010-11-17 11:21


那你怎么能保证遍历的时候,这个链表没有被写入呢,如果这时正好有一个插入动作呢?

作者: Godbach   发布时间: 2010-11-17

回复 Godbach
明白了。看了一下list.h源码,原来hlist_add_head_rcu是两步指针的赋值操作,不是原子操作,应该用锁。
如果直接按下面使用的话(不带头结点的链表)应该就不需要锁了:
newnode为要插入的节点,list为链表。
newnode->next=list;
list=newnode.

呵呵,可惜内核不是这样用的。

作者: 瀚海书香   发布时间: 2010-11-17



QUOTE:
如果直接按下面使用的话(不带头结点的链表)应该就不需要锁了:
newnode为要插入的节点,list为链表。
newnode->next=list;
list=newnode.


多核情况下,这也需要加锁吧

作者: Godbach   发布时间: 2010-11-17

回复 Godbach
真正修改链表的时候就是 list=newnode
这应该是个原子操作吧? 如果是原子操作,为什么会需要锁呢?

作者: 瀚海书香   发布时间: 2010-11-17