用最简单的话概括这两个宏的区别:一个是安全的,一个是不安全的。
先看一下这个宏的定义:
- 328 #define list_for_each(pos, head) \
- 329 for (pos = (head)->next, prefetch(pos->next); pos != (head); \
- 330 pos = pos->next, prefetch(pos->next))
- 360 #define list_for_each_safe(pos, n, head) \
- 361 for (pos = (head)->next, n = pos->next; pos != (head); \
- 362 pos = n, n = pos->next)
我们看出:宏list_for_each_safe多引入了一个变量struct list_head *n;这是由于这个变量的作用,才做到了list_for_each_safe的安全性。
对于list_for_each而言,如果再遍历的同时对链表的元素进行删除,那么就出现了不安全的状况。
- list_for_each
- list_del //这将引发kernel panic
- list_for_each
- list_del_init//这将引发死循环
而用于list_for_each_safe已经提前把指向下一个节点的指针存入变量n中,所以你对当前节点的删除操作不会影响到遍历过程。
阅读(5921) | 评论(0) | 转发(0) |