list_for_each_safe()
2010-10-25 14:46
253 查看
如果在遍历过程中,包含有删除或移动当前链接节点的操作,由于这些操作会修改遍历指针,这样会导致遍历的中端。这种情况下,必须使用list_for_each_safe宏,在操作之前将遍历指针缓存下来。内核中解释的精华部分:
/*
list_for_each_safe -iterate over a list safe against removal of list entry
*/
#define list_for_each_safe(pos,n,head)/
for(pos=(head)->next,n=pos->next;pos!=(head);pos=n,n=pos->next)
在for循环中n暂存pos下一个节点的地址,避免因pos节点被释放而造成的断链。也就是说你可以遍历完当前节点后将其删除,同时可以接着访问下一个节点,遍历完毕后就只剩下一个头节点。这就叫safe。典型用途是多个进程等待在同一个等待队列上,若事件发生时唤醒所有进程,则可以唤醒后将其一次从等待队列中删除。
/*
list_for_each_safe -iterate over a list safe against removal of list entry
*/
#define list_for_each_safe(pos,n,head)/
for(pos=(head)->next,n=pos->next;pos!=(head);pos=n,n=pos->next)
在for循环中n暂存pos下一个节点的地址,避免因pos节点被释放而造成的断链。也就是说你可以遍历完当前节点后将其删除,同时可以接着访问下一个节点,遍历完毕后就只剩下一个头节点。这就叫safe。典型用途是多个进程等待在同一个等待队列上,若事件发生时唤醒所有进程,则可以唤醒后将其一次从等待队列中删除。
相关文章推荐
- list_for_each()与list_for_each_safe()的区别
- list_for_each()与list_for_each_safe()的区别
- list_for_each_entry和list_for_each_entry_safe
- 【Linux】list_for_each()与list_for_each_safe()的区别
- 遍历Linux kernel的链表时删除节点的方法 list_for_each_safe
- list_for_each_entry list_for_each_entry_safe
- list_for_each()与list_for_each_safe()的区别
- 需要list_for_each_safe的原因
- list_for_each_safe
- list_for_each()与list_for_each_safe()
- list_for_each & list_entry & 对内核链表的理解
- Safe to store list::iterator for later use?
- list_for_each_entry
- list_for_each_entry
- list_for_each_entry分析
- 浅析遍历子进程方法(利用list_for_each)
- Linux内核中list_for_each()和list_for_each_save()
- list_for_each_entry
- php数组的遍历讲解 for foreach list each key
- List for each entry