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