Megosztás a következőn keresztül:


Szál megszakítása

A szál megszakítása a következő eredményekkel jár:

  • A szál által birtokolt erőforrások, például az ablakok és a horgok felszabadulnak.
  • A szál kilépési kódja be van állítva.
  • A szálobjektum jelzést ad.
  • Ha a folyamat egyetlen aktív szála a szál, a folyamat leáll. További információ: Folyamat leállítása.

A GetExitCodeThread függvény visszaadja egy szál megszakítási állapotát. Miközben egy szál végrehajtás alatt van, a megszakítási állapota STILL_ACTIVE. Amikor egy szál leáll, a leállítás állapota STILL_ACTIVE-ről a szál kilépési kódjára változik.

Amikor egy szál leáll, a szál objektumának állapota jelzettre változik, felszabadítva minden olyan másik szálat, amely a szál leállítására várt. További információ a szinkronizálásról: Több szál végrehajtásának szinkronizálása.

Amikor egy szál leáll, a szálobjektum nem szabadul fel, amíg a szál összes nyitott fogópontját be nem zárják.

A szálak leállítása

Egy szál addig fut, amíg az alábbi események valamelyike nem következik be:

  • A szál meghívja a ExitThread függvényt.
  • A folyamat bármely szála meghívja az ExitProcess függvényt.
  • A szálfüggvény visszatér.
  • Minden szál meghívja a TerminateThread függvényt egy fogóponttal a szálhoz.
  • Minden szál meghívja a TerminateProcess függvényt a folyamathoz tartozó leíróval.

A szál kilépési kódja vagy az ExitThread , ExitProcess, TerminateThreadvagy TerminateProcesshívásban megadott érték, vagy a szálfüggvény által visszaadott érték.

Ha ExitThreadmegszakít egy szálat, a rendszer meghívja az egyes csatolt DLL-ek belépési pontfüggvényét egy olyan értékkel, amely azt jelzi, hogy a szál le van választva a DLL-ről (hacsak nem hívja meg a DisableThreadLibraryCalls függvényt). Ha egy szálat a ExitProcessbefejez, a DLL belépési pont függvényei egyszer kerülnek meghívásra, jelezve, hogy a folyamat leválasztásra kerül. A DLL-ek nem kapnak értesítést, ha egy szálat TerminateThread vagy TerminateProcessszakít meg. További információ a DLL-ekről: Dynamic-Link Kódtárak.

A TerminateThread és TerminateProcess függvényeket csak szélsőséges körülmények között szabad használni, mivel nem teszik lehetővé a szálak törlését, nem értesítik a csatolt DLL-eket, és nem szabadítják fel a kezdeti vermet. Emellett a szál tulajdonában lévő objektumok kezelői mindaddig nem lesznek lezárva, amíg a folyamat be nem fejeződik. Az alábbi lépések jobb megoldást nyújtanak:

  • Eseményobjektum létrehozása a CreateEvent függvénnyel.
  • Hozza létre a szálakat.
  • Minden szál a WaitForSingleObject függvény meghívásával figyeli az esemény állapotát. Használjon nulla várakozási időtúllépési időközt.
  • Minden szál leállítja a saját végrehajtását, amikor az esemény a jelzett állapotra van állítva (WaitForSingleObject WAIT_OBJECT_0 ad vissza).