Gekoppelde lijsten met vergrendelingen
Een gekoppelde lijst met knooppunten (SList) vereenvoudigt de taak van invoegen en verwijderen uit een gekoppelde lijst. SLists worden geïmplementeerd met behulp van een niet-blokkerend algoritme om atomische synchronisatie te bieden, de systeemprestaties te verbeteren en problemen zoals prioriteitinversion en vergrendelingsconvoy's te voorkomen.
SLists zijn eenvoudig te implementeren en te gebruiken in 32-bits code. Het is echter lastig om ze te implementeren in 64-bits code, omdat de hoeveelheid gegevens die kan worden uitgewisseld door de systeemeigen interlocked exchange primitieven niet de dubbele adresgrootte is, omdat deze zich in de 32-bits code bevindt. Daarom maken SLists het mogelijk om schaalbare high-end algoritmen naar Windows te overzetten.
Windows 8: Vanaf Windows 8 zijn de juiste systeemeigen uitwisselingsprimitieven beschikbaar voor 64-bits code, bijvoorbeeld InterlockedCompare64Exchange128.
Toepassingen kunnen SLists gebruiken door de functie InitializeSListHead aan te roepen om het hoofd van de lijst te initialiseren. Als u items in de lijst wilt invoegen, gebruikt u de functie InterlockedPushEntrySList. Als u items uit de lijst wilt verwijderen, gebruikt u de functie InterlockedPopEntrySList.
Alle lijstitems moeten worden uitgelijnd op een MEMORY_ALLOCATION_ALIGNMENT grens. Niet-uitgelijnde items kunnen onvoorspelbare resultaten veroorzaken. Zie _aligned_malloc.
Zie voor een voorbeeld Singly Linked Lists gebruiken.
De volgende tabel bevat de SList-functies.
Functie | Beschrijving |
---|---|
InitializeSListHead | Initialiseert het hoofd van een zanglijst. |
InterlockedFlushSList | Hiermee wordt de hele lijst met items in een singly gekoppelde lijst leeggemaakt. |
InterlockedPopEntrySList | Hiermee verwijdert u een item aan de voorzijde van een ingly-gekoppelde lijst. |
InterlockedPushEntrySList | Hiermee voegt u een item aan de voorzijde van een ingly-gekoppelde lijst in. |
InterlockedPushListSList | Hiermee voegt u een singly-gekoppelde lijst toe aan de voorzijde van een andere ingly-gekoppelde lijst. |
InterlockedPushListSListSListEx- | Hiermee voegt u een singly-gekoppelde lijst toe aan de voorzijde van een andere ingly-gekoppelde lijst. Deze versie van de methode maakt geen gebruik van de __fastcall aanroepconventie. |
RtlFirstEntrySList | Hiermee haalt u het eerste item op in een singly gekoppelde lijst. |
QueryDepthSList | Hiermee haalt u het aantal vermeldingen op in de opgegeven singly gekoppelde lijst. |