2013-03-11 4 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()' केवल आगे की दिशा में सूची ट्रैवर्सल (रीडिंग) के लिए सुरक्षित प्रतीत होता है। कुछ 'आर्क' को लॉक-फ्री लिखा जा सकता है, लेकिन लिनक्स ने अभी तक ऐसा नहीं किया है। (यह ज्ञात हो सकता है, लेकिन मुझे लगता है कि यह उल्लेखनीय है)। –

उत्तर

5

मुझे लगता है कि आप टिप्पणी गलत:

यह मेरा कार्यान्वयन वर्तमान में है। पहला व्यक्ति कहता है कि list_empty(&entry->list) सच नहीं होगा। हालांकि, अगर आप सूची (जिस तरह से आप यह सही है करते हैं) से सभी तत्वों को हटाने और list_empty(&mylist.list) कर आप एक परिणाम के रूप में सच हो जाएगा।

किसी कारण से आप प्रवेश के struct list_head एक आंतरिक रूप से संगत राज्य में रखना चाहते हैं, list_del_init का उपयोग करें।

दूसरे, __list_del केवल, list_del निष्पक्ष खेल है आंतरिक उपयोग के लिए है।

+0

+1, मैं भी ध्यान रखें कि 'list_del()' आंतरिक उपयोग, '__list_del() के लिए नहीं है चाहें' है। – Hasturkun

+0

आप सही हैं @ हास्टुरकुन, उस टिप्पणी के लिए धन्यवाद। –

+0

+1 भी http://lwn.net/Articles/336255/ देखें कि किन उपयोग पैटर्न पर कुछ सिंहावलोकन देता है। –

संबंधित मुद्दे