Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C linux/list.h-如何安全地从列表中删除项目?_C_List_Linux Kernel - Fatal编程技术网

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还没有做到这一点。(这可能是众所周知的,但我认为值得一提)。