2016-08-03 4 views
0

私はLinuxカーネルのロックレスリストを理解しようとしています。これはllist.hで定義されています。次のノードへのポインタを持っているただ一つの構造体を持っていないのはなぜなぜLinuxカーネルのロックレスリストにヘッド構造とノード構造があるのですか?

struct llist_head { 
    struct llist_node *first; 
}; 

struct llist_node { 
    struct llist_node *next; 
}; 

:なぜ彼らはリストを定義するために、2の構造体を持っているのですか?これは、カーネル内の二重リンクリストの実装に似ています。

+2

リストが空であるとします。 ... – fukanchik

+0

カーネルの二重リンクリストの実装(ロックレスではない)は、二つの構造体を持たずに空のリストを扱います。 – user2233706

+0

フィールド名の名前が異なることを確認してください。最初の要素を 'first'、' next'ではなく最初の要素を呼びたいと思ってください。これは、識別子が_other_文脈では有効でないため、**コピー&ペースト**プログラミングからのいくつかのエラーを防ぎます。 –

答えて

0

リストを定義するのに2つの構造体があるのはなぜですか?

それは異なるもの(ヘッドおよびそれに対応したノード)のための異なる構造体(タイプ)を使用することも可能ですので。 Linuxカーネルは、通常のプログラミングと同じように機能します。二重リンクリストの場合

は、ヘッドノードの両方が同じタイプを有することを余儀なくされている:設計によって、struct list_headの両方nextprevフィールドは、ノードまたはヘッドのいずれかを指すことができます。それらのシングルタイプは利点ではありませんが、必要性です。

+0

あなたは 'union {struct head a; struct node b;} 'を呼び出し、代わりにポインタを' union'へのポインタにしてください。_necessity_は最初のプロトタイプでは問題ありませんが、品質コードでは異なるものをタイプする必要があります**。 –

+0

@ LuisColoradoですが、ユニオンエイリアシングに注意しなければなりません(あなたのコードでは起こらないようにしてください)。 – 0andriy

関連する問題