如果在遍历过程中,包含有删除或移动当前链接节点的操作,由于这些操作会修改遍历指针,这样会导致遍历的中端。这种情况下,必须使用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宏来缓存下一个节点地址,确保遍历过程的安全性。
3039

被折叠的 条评论
为什么被折叠?



