Bagikan melalui


Mengakhiri Utas

Mengakhiri utas memiliki hasil berikut:

  • Sumber daya apa pun yang dimiliki oleh utas, seperti jendela dan kait, dikosongkan.
  • Kode keluar utas diatur.
  • Objek utas diberi sinyal.
  • Jika utas adalah satu-satunya utas aktif dalam proses, proses dihentikan. Untuk informasi selengkapnya, lihat Mengakhiri Proses.

Fungsi GetExitCodeThread mengembalikan status penghentian utas. Saat utas dijalankan, status penghentiannya STILL_ACTIVE. Ketika utas berakhir, status penghentiannya berubah dari STILL_ACTIVE ke kode keluar utas.

Ketika utas berakhir, status objek utas berubah menjadi sinyal, melepaskan utas lain yang telah menunggu utas dihentikan. Untuk informasi selengkapnya tentang sinkronisasi, lihat Menyinkronkan Eksekusi Beberapa Utas.

Ketika utas berakhir, objek utasnya tidak dikosongkan sampai semua handel terbuka ke utas ditutup.

Bagaimana Utas Dihentikan

Utas dijalankan hingga salah satu peristiwa berikut terjadi:

Kode keluar untuk utas adalah nilai yang ditentukan dalam panggilan ke ExitThread, ExitProcess, TerminateThread, atau TerminateProcess, atau nilai yang dikembalikan oleh fungsi utas.

Jika utas dihentikan oleh ExitThread, sistem memanggil fungsi titik entri dari setiap DLL terlampir dengan nilai yang menunjukkan bahwa utas terlepas dari DLL (kecuali Anda memanggil fungsi DisableThreadLibraryCalls ). Jika utas dihentikan oleh ExitProcess, fungsi titik masuk DLL dipanggil sekali, untuk menunjukkan bahwa prosesnya terlepas. DLL tidak diberi tahu ketika utas dihentikan oleh TerminateThread atau TerminateProcess. Untuk informasi selengkapnya tentang DLL, lihat Pustaka Dynamic-Link.

Fungsi TerminateThread dan TerminateProcess harus digunakan hanya dalam keadaan ekstrem, karena tidak mengizinkan utas untuk membersihkan, tidak memberi tahu DLL yang terpasang, dan tidak membebaskan tumpukan awal. Selain itu, handel ke objek yang dimiliki oleh utas tidak ditutup sampai proses berakhir. Langkah-langkah berikut memberikan solusi yang lebih baik:

  • Buat objek peristiwa menggunakan fungsi CreateEvent .
  • Buat utas.
  • Setiap utas memantau status peristiwa dengan memanggil fungsi WaitForSingleObject . Gunakan interval waktu tunggu habis nol.
  • Setiap utas mengakhiri eksekusinya sendiri ketika peristiwa diatur ke status bersinyali (WaitForSingleObject mengembalikan WAIT_OBJECT_0).