2013-03-11 25 views
7

linux/list.h評論它是寫的是:linux/list.h - 如何從列表中安全刪除項目?

  1. 使用list_del_entry注:list_empty在進入不返回後這個真實的,該項處於不確定狀態。
  2. 對於list_del這僅適用於內部列表操作,我們已知道上一個/下一個條目!

所以,我將如何安全地從鏈表中刪除對象,並確保list_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); 
} 
+0

如果列表可以在兩個上下文中使用,則需要使用鎖定。符號'_safe()'似乎是安全的,只能用於正向的列表遍歷(閱讀)。一些'archs'可以被無鎖寫入,但Linux尚未做到這一點。 (這可能是已知的,但我認爲這是值得一提的)。 – 2013-03-17 14:02:58

回答

5

我想你誤會了意見。第一個說list_empty(&entry->list)不會返回true。但是,如果您從列表中刪除所有元素(執行的方式是正確的),並且執行list_empty(&mylist.list),則結果將爲真。

如果由於某種原因想要保持條目struct list_head處於內部一致狀態,請使用list_del_init

其次,__list_del僅供內部使用,list_del是公平遊戲。

+0

+1,我還想指出'list_del()'不適合內部使用,'__list_del()'是。 – Hasturkun 2013-03-11 10:59:02

+0

你說得對@Hasturkun,謝謝你的評論。 – 2013-03-11 11:02:17

+0

+1另請參閱http://lwn.net/Articles/336255/,其中對使用模式進行了一些概述。 – 2013-03-12 03:34:17