連結された 1 つのリンクされたリスト
連結された 1 つのリンク リスト (SList) を使用すると、リンクリストからの挿入と削除のタスクが容易になります。 SList は、非ブロッキング アルゴリズムを使用して実装され、アトミック同期を提供し、システムパフォーマンスを向上させ、優先度反転やロックコンボイなどの問題を回避します。
SList は、32 ビット コードでの実装と使用が簡単です。 ただし、ネイティブのインターロックされた交換プリミティブで交換できるデータの量は、32 ビット コードであるため、アドレス サイズの 2 倍ではないので、64 ビット コードで実装するのは困難です。 そのため、SLists を使用すると、ハイエンドのスケーラブルなアルゴリズムを Windows に移植できます。
Windows 8: Windows 8以降では、適切なネイティブのインターロックされた交換プリミティブを 64 ビット コード (InterlockedCompare64Exchange128 など) で使用できます。
アプリケーションでは、 InitializeSListHead 関数を呼び出してリストの先頭を初期化することで、SLists を使用できます。 リストに項目を挿入するには、 InterlockedPushEntrySList 関数を使用します。 リストから項目を削除するには、 InterlockedPopEntrySList 関数を使用します。
すべてのリスト アイテムは、 MEMORY_ALLOCATION_ALIGNMENT 境界に配置する必要があります。 整列されていない項目は、予期しない結果を引き起こす可能性があります。 「_aligned_malloc」を参照してください。
例については、「 Singly リンク リストの使用」を参照してください。
次の表に、SList 関数の一覧を示します。
機能 | 説明 |
---|---|
InitializeSListHead | 1 つのリンクされたリストの先頭を初期化します。 |
InterlockedFlushSList | 1 つのリンクされたリスト内のアイテムのリスト全体をフラッシュします。 |
InterlockedPopEntrySList | 1 つのリンクリストの先頭から項目を削除します。 |
InterlockedPushEntrySList | 1 つのリンクリストの先頭に項目を挿入します。 |
InterlockedPushListSList | 1 つのリンクされたリストを、1 つのリンクされた別のリストの先頭に挿入します。 |
InterlockedPushListSListEx | 1 つのリンクされたリストを、1 つのリンクされた別のリストの先頭に挿入します。 このバージョンの メソッドでは、 __fastcall 呼び出し規則は使用されません。 |
RtlFirstEntrySList | 1 つのリンクされたリストの最初のエントリを取得します。 |
QueryDepthSList | 指定した 1 つのリンクリスト内のエントリの数を取得します。 |