2016-08-03 40 views
0

Ich versuche, die Lockless-Liste im Linux-Kernel zu verstehen. Dies ist in llist.h definiert. Warum haben sie zwei Strukturen, eine Liste zu definieren:Warum hat die Sperrliste des Linux-Kernels Kopf- und Knotenstrukturen?

struct llist_head { 
    struct llist_node *first; 
}; 

struct llist_node { 
    struct llist_node *next; 
}; 

Warum nicht nur eine Struktur haben, die einen Zeiger auf den nächsten Knoten hat? Es wäre ähnlich der doppelt verknüpften Liste Implementierung im Kernel.

+2

Stellen Sie sich vor, die Liste ist leer, z. Es gibt keinen einzigen "Knoten" darin ... – fukanchik

+0

Die doppelt verkettete Listenimplementierung des Kernels (nicht lock-less) behandelt leere Listen, ohne zwei Strukturen zu haben. – user2233706

+0

Schauen Sie, dass Feldnamen unterschiedlich benannt sind. Stellen Sie sich vor, Sie möchten das erste Element "first" und nicht "next" nennen. Dies verhindert einige Fehler, die von der ** Kopieren & Einfügen ** -Programmierung stammen, da die Identifikatoren im _other_-Kontext nicht gültig sind. –

Antwort

0

Warum haben sie zwei Strukturen, um eine Liste zu definieren?

Weil es möglich ist verschiedene struct (Typen) zu verwenden, um verschiedene Dinge (Kopf und Knoten entsprechend). Der Linux-Kernel folgt in der Regel den gleichen Konventionen wie für die normale Programmierung.

Bei Doppel verkettete Listen, sowohl Kopf- und Knoten sind den gleichen Typ haben gezwungen: by Design, beide next und prev Bereichen struct list_head entweder zum Knoten oder zu den Kopfpunkt kann. Single-Typ für sie ist kein Vorteil, aber Notwendigkeit.

+0

Sie können 'union {struct head a; Struct Node b;} 'und machen Sie Ihren Zeiger ein Zeiger auf die" Union "statt .... _Notwendigkeit_ kann für einen ersten Prototyp in Ordnung sein, aber in Quality-Code ** müssen Sie verschiedene Dinge, die anders sind ** eingeben. –

+0

@LuisColorado, aber Sie müssen auf Union Aliasing achten (sollte nicht in Ihrem Code passieren). – 0andriy