Chinaunix首页 | 论坛 | 博客
  • 博客访问: 110348
  • 博文数量: 24
  • 博客积分: 1335
  • 博客等级: 中尉
  • 技术积分: 415
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-25 10:07
文章分类
文章存档

2011年(22)

2010年(2)

分类: LINUX

2010-12-02 11:52:16

#define list_for_each(pos, head) \
for (pos = (head)->next; prefetch(pos->next), pos != (head); \
pos = pos->next)
由定义可知,list_del(pos)(将pos的前后指针指向undefined state)panic,list_del_init(pos)(将pos前后指针指向自身)导致死循环。

#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)

由定义可知,safe函数首先将pos的后指针缓存到n,处理一个流程后再赋回pos,避免了这种情况的发生。
因此只遍历链表不删除节点时可以使用前者,若有删除节点的操作,则要使用后者。

由safe的说明可知,是专门为删除节点时准备的:iterate over a list safe against removal of list entry。
其他带safe的处理也基本源于这个原因。

文章转自:http://hi.baidu.com/ghy0504/blog/item/415f13179ad6474621a4e9c3.html
阅读(1842) | 评论(0) | 转发(0) |
0

上一篇:原始套接字(转)

下一篇:vim实用技巧

给主人留下些什么吧!~~