linux内核删除list_del()删除元素…

来源:互联网 发布:淘宝小号无忧网 编辑:程序博客网 时间:2024/05/22 14:34

 关于删除元素的不安全性
为什么说调用list_del()删除元素有安全隐患?具体看源代码:

static inline void __list_del(struct list_head * prev, structlist_head * next)
{
next->prev = prev;
prev->next = next;
}

static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
entry->next = LIST_POISON1;
entry->prev = LIST_POISON2;
}
可以看出,当执行删除操作的时候, 被删除的节点的两个指针被指向一个固定的位置(entry->next =LIST_POISON1;
entry->prev = LIST_POISON2;)。而list_for_each(pos,head)中的pos指针在遍历过程中向后移动,即pos =pos->next,如果执行了list_del()操作,pos将指向这个固定位置的next, prev,而此时的next,prev没有任何意义,别无选择,出错。
而list_for_each_safe(p, n, head) 宏解决了上面的问题:

#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head);\
pos = n, n = pos->next)
它采用了一个同pos同样类型的指针n 来暂存将要被删除的节点指针pos,从而使得删除操作不影响pos指针!

实际上,list.h的设计可谓精益求精,煞费苦心,用简洁的代码突破计算机科学中传统的链表实际机制,不仅考虑了单处理机,还利用了PaulE.McKenney提出的RCU(读拷贝更新)的技术,从而提高了多处理机环境下的性能。关于RCU,请看http://www.rdrop.com/users/paulmck/rclock/

0 0