C linux/list.h-如何安全地从列表中删除项目?
其评论中写道:C linux/list.h-如何安全地从列表中删除项目?,c,list,linux-kernel,C,List,Linux Kernel,其评论中写道: 使用list\u del\u条目时:注意:list\u emptyOn entry不会返回true。在此之后,条目处于未定义状态 对于list\u del:这仅用于我们已经知道上一个/下一个条目的内部列表操作 那么,我如何安全地从链表中删除一个对象,并确保list\u empty功能正常,或者确保下一个链表节点删除操作正确 这是我目前的实施: struct kool_list{ int to; struct list_head list; int from
list\u del\u条目时
:注意:list\u empty
On entry不会返回true。在此之后,条目处于未定义状态李>
list\u del
:这仅用于我们已经知道上一个/下一个条目的内部列表操作李>
那么,我如何安全地从链表中删除一个对象,并确保list\u empty
功能正常,或者确保下一个链表节点删除操作正确
这是我目前的实施:
struct kool_list{
int to;
struct list_head list;
int from;
};
struct kool_list *tmp;
struct list_head *pos, *q;
struct kool_list mylist;
list_for_each_safe(pos, q, &mylist.list){
tmp= list_entry(pos, struct kool_list, list);
printf("freeing item to= %d from= %d\n", tmp->to, tmp->from);
list_del(pos);
free(tmp);
}
我想你误解了这些评论。第一个表示
list\u empty(&entry->list)
不会返回true。但是,如果您从列表中删除所有元素(您这样做的方式是正确的),并且执行list\u empty(&mylist.list)
操作,您将得到正确的结果
如果出于某种原因,您希望使条目的struct list\u head
处于内部一致状态,请使用list\u del\u init
其次,
列表del
仅用于内部使用,列表del
是公平的游戏。+1,我还想指出,列表del()
不用于内部使用,列表del()
是。+1另请参见其中给出了一些使用模式的概述。如果列表可以从两个上下文使用,则需要使用锁。符号\u safe()
似乎仅对正向的列表遍历(读取)是安全的。一些arch
可以无锁编写,但Linux还没有做到这一点。(这可能是众所周知的,但我认为值得一提)。