Chinaunix首页 | 论坛 | 博客
  • 博客访问: 231988
  • 博文数量: 37
  • 博客积分: 933
  • 博客等级: 军士长
  • 技术积分: 511
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-16 10:15
文章分类
文章存档

2012年(1)

2011年(36)

分类: C/C++

2011-04-27 09:46:33

用最简单的话概括这两个宏的区别:一个是安全的,一个是不安全的。
 
先看一下这个宏的定义:
  1.  328 #define list_for_each(pos, head) \
  2.  329 for (pos = (head)->next, prefetch(pos->next); pos != (head); \
  3.  330 pos = pos->next, prefetch(pos->next))
     
  1.  360 #define list_for_each_safe(pos, n, head) \
  2.  361 for (pos = (head)->next, n = pos->next; pos != (head); \
  3.  362 pos = n, n = pos->next)

我们看出:宏list_for_each_safe多引入了一个变量struct list_head *n;这是由于这个变量的作用,才做到了list_for_each_safe的安全性。

对于list_for_each而言,如果再遍历的同时对链表的元素进行删除,那么就出现了不安全的状况。

  1. list_for_each
  2.      list_del //这将引发kernel panic
  3. list_for_each
  4.      list_del_init//这将引发死循环
而用于list_for_each_safe已经提前把指向下一个节点的指针存入变量n中,所以你对当前节点的删除操作不会影响到遍历过程。
阅读(5876) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~