Trådstackens storlek

Varje ny tråd eller fiber får ett eget stackutrymme som består av både reserverat och initialt incheckat minne. Den reserverade minnesstorleken representerar den totala stackallokeringen i virtuellt minne. Därför är den reserverade storleken begränsad till det virtuella adressintervallet. De ursprungligen incheckade sidorna använder inte fysiskt minne förrän de refereras. De tar dock bort sidor från systemets totala incheckningsgräns, vilket är sidfilens storlek plus storleken på det fysiska minnet. Systemet checkar in ytterligare sidor från det reserverade stackminnet när de behövs, tills stacken når den reserverade storleken minus en sida (som används som en skyddssida för att förhindra stackspill) eller systemet har så lite minne att åtgärden misslyckas.

Det är bäst att välja en så liten stackstorlek som möjligt och checka in den stack som behövs för att tråden eller fibern ska köras tillförlitligt. Varje sida som är reserverad för stacken kan inte användas för något annat ändamål.

En stack frigörs när tråden avslutas. Den frigörs inte om tråden avslutas av en annan tråd.

Standardstorleken för det reserverade och ursprungligen incheckade stackminnet anges i det körbara filhuvudet. Det går inte att skapa tråd eller fiber om det inte finns tillräckligt med minne för att reservera eller checka in antalet begärda byte. Standardstorleken för stackreservationen som används av länkaren är 1 MB. Om du vill ange en annan standardstorlek för stackreservation för alla trådar och fibrer använder du STACKSIZE-instruktionen i moduldefinitionsfilen (.def). Operativsystemet avrundar den angivna storleken till närmaste multipel av systemets allokeringskornighet (vanligtvis 64 KB). Om du vill hämta allokeringskornigheten för det aktuella systemet använder du funktionen GetSystemInfo.

Om du vill ändra det ursprungligen incheckade stackutrymmet använder du parametern dwStackSize för funktionen CreateThread, CreateRemoteThreadeller CreateFiber. Det här värdet avrundas upp till närmaste sida. I allmänhet är reservstorleken den standardreservstorlek som anges i det körbara huvudet. Men om den ursprungligen incheckade storleken som anges av dwStackSize är större än eller lika med standardreservstorleken, är reservstorleken den nya incheckningsstorleken avrundad upp till närmaste multipel på 1 MB.

Om du vill ändra storleken på den reserverade stacken anger du parametern dwCreationFlags för CreateThread eller CreateRemoteThread för att STACK_SIZE_PARAM_IS_A_RESERVATION och använda parametern dwStackSize. I det här fallet är den ursprungligen incheckade storleken den standardstorlek som anges i den körbara rubriken. För fibrer använder du parametern dwStackReserveSize för CreateFiberEx. Den incheckade storleken anges i parametern dwStackCommitSize.

Funktionen SetThreadStackGuarantee anger den minsta storleken på stacken som är associerad med den anropande tråden eller fibern som ska vara tillgänglig under eventuella stacköverflödesfel.