Sdílet prostřednictvím


Ukončení vlákna

Ukončení vlákna má následující výsledky:

  • Všechny prostředky vlastněné vláknem, jako jsou okna a háčky, jsou uvolněny.
  • Nastaví se ukončovací kód vlákna.
  • Objekt vlákna je signalován.
  • Pokud je vlákno jediným aktivním vláknem v procesu, proces se ukončí. Další informace naleznete v tématu Ukončení procesu.

Funkce GetExitCodeThread vrátí stav ukončení vlákna. Během provádění vlákna je jeho stav ukončení "STILL_ACTIVE". Když se vlákno ukončí, stav ukončení se změní z STILL_ACTIVE na ukončovací kód vlákna.

Když se vlákno ukončí, stav objektu vlákna se změní na signál a uvolní všechna ostatní vlákna, která čekala na ukončení vlákna. Další informace o synchronizaci naleznete v tématu Synchronizace provádění více vláken.

Když se vlákno ukončí, jeho objekt vlákna není uvolněn, dokud nebudou uzavřeny všechny otevřené popisovače vlákna.

Způsob ukončení vláken

Vlákno se spustí, dokud nedojde k jedné z následujících událostí:

Ukončovací kód vlákna je buď hodnota zadaná ve volání ExitThread, ExitProcess, TerminateThreadnebo TerminateProcess, nebo hodnotu vrácenou funkcí vlákna.

Pokud je vlákno ukončeno ExitThread, systém volá vstupní funkci každé připojené knihovny DLL s hodnotou označující, že vlákno je odpojeno od knihovny DLL (pokud nevoláte funkci DisableThreadLibraryCalls). Pokud je vlákno ukončeno ExitProcess, funkce vstupního bodu knihovny DLL jsou vyvolány jednou, aby informovaly o odpojení procesu. Knihovny DLL nejsou upozorněny, když je vlákno ukončeno pomocí TerminateThread nebo TerminateProcess. Další informace o knihovnách DLL naleznete v tématu Dynamic-Link knihovny.

Funkce TerminateThread a TerminateProcess by se měly používat pouze za extrémních okolností, protože neumožňují vyčištění vláken, neoznamujte připojené knihovny DLL a nevyvolávejte počáteční zásobník. Kromě toho zůstávají popisovače objektů vlastněných vláknem otevřené, dokud proces neskončí. Následující kroky poskytují lepší řešení:

  • Vytvořte objekt události pomocí funkce CreateEvent.
  • Vytvořte vlákna.
  • Každé vlákno monitoruje stav události voláním WaitForSingleObject funkce. Použijte interval časového limitu čekání s hodnotou nula.
  • Každé vlákno ukončí vlastní spuštění, když je událost nastavena na signalovaný stav (WaitForSingleObject vrátí WAIT_OBJECT_0).