Kumpulan Utas

Kumpulan utas adalah kumpulan utas pekerja yang secara efisien menjalankan panggilan balik asinkron atas nama aplikasi. Kumpulan utas terutama digunakan untuk mengurangi jumlah utas aplikasi dan menyediakan manajemen utas pekerja. Aplikasi dapat mengantre item kerja, mengaitkan pekerjaan dengan handel yang dapat ditunggu, secara otomatis mengantre berdasarkan timer, dan mengikat dengan I/O.

Arsitektur Kumpulan Utas

Aplikasi berikut dapat memperoleh manfaat dari menggunakan kumpulan utas:

  • Aplikasi yang sangat paralel dan dapat mengirimkan sejumlah besar item kerja kecil secara asinkron (seperti pencarian indeks terdistribusi atau I/O jaringan).
  • Aplikasi yang membuat dan menghancurkan sejumlah besar utas yang masing-masing berjalan untuk waktu yang singkat. Menggunakan kumpulan utas dapat mengurangi kompleksitas manajemen utas dan overhead yang terlibat dalam pembuatan dan penghancuran utas.
  • Aplikasi yang memproses item kerja independen di latar belakang dan secara paralel (seperti memuat beberapa tab).
  • Aplikasi yang harus melakukan tunggu eksklusif pada objek kernel atau memblokir peristiwa masuk pada objek. Menggunakan kumpulan utas dapat mengurangi kompleksitas manajemen utas dan meningkatkan performa dengan mengurangi jumlah sakelar konteks.
  • Aplikasi yang membuat utas pelayan kustom untuk menunggu peristiwa.

Kumpulan utas asli telah sepenuhnya disusun ulang di Windows Vista. Kumpulan utas baru ditingkatkan karena menyediakan jenis utas pekerja tunggal (mendukung I/O dan non-I/O), tidak menggunakan utas timer, menyediakan antrean timer tunggal, dan menyediakan utas persisten khusus. Ini juga menyediakan grup pembersihan, performa yang lebih tinggi, beberapa kumpulan per proses yang dijadwalkan secara independen, dan API kumpulan utas baru.

Arsitektur kumpulan utas terdiri dari yang berikut ini:

  • Utas pekerja yang menjalankan fungsi panggilan balik
  • Utas pelayan yang menunggu di beberapa handel tunggu
  • Antrean kerja
  • Kumpulan utas default untuk setiap proses
  • Pabrik pekerja yang mengelola utas pekerja

Praktik Terbaik

API kumpulan utas baru memberikan lebih banyak fleksibilitas dan kontrol daripada API kumpulan utas asli. Namun, ada beberapa perbedaan yang halang tetapi penting. Di API asli, reset tunggu otomatis; di API baru, penantian harus direset secara eksplisit setiap kali. API asli menangani peniruan secara otomatis, mentransfer konteks keamanan proses panggilan ke utas. Dengan API baru, aplikasi harus secara eksplisit mengatur konteks keamanan.

Berikut ini adalah praktik terbaik saat menggunakan kumpulan utas:

  • Utas proses berbagi kumpulan utas. Satu utas pekerja dapat menjalankan beberapa fungsi panggilan balik, satu per satu. Utas pekerja ini dikelola oleh kumpulan utas. Oleh karena itu, jangan hentikan utas dari kumpulan utas dengan memanggil TerminateThread pada utas atau dengan memanggil ExitThread dari fungsi panggilan balik.

  • Permintaan I/O dapat berjalan pada utas apa pun di kumpulan utas. Membatalkan I/O pada utas kumpulan utas memerlukan sinkronisasi karena fungsi pembatalan mungkin berjalan pada utas yang berbeda dari yang menangani permintaan I/O, yang dapat mengakibatkan pembatalan operasi yang tidak diketahui. Untuk menghindari hal ini, selalu berikan struktur TUMPANG TINDIH dengan permintaan I/O yang dimulai saat memanggil CancelIoEx untuk I/O asinkron, atau gunakan sinkronisasi Anda sendiri untuk memastikan bahwa tidak ada I/O lain yang dapat dimulai pada utas target sebelum memanggil fungsi CancelSynchronousIo atau CancelIoEx .

  • Bersihkan semua sumber daya yang dibuat dalam fungsi panggilan balik sebelum kembali dari fungsi . Ini termasuk TLS, konteks keamanan, prioritas utas, dan pendaftaran COM. Fungsi panggilan balik juga harus memulihkan status utas sebelum kembali.

  • Jaga handel tunggu dan objek terkait tetap hidup sampai kumpulan utas memberi sinyal bahwa selesai dengan pegangan.

  • Tandai semua utas yang menunggu operasi yang panjang (seperti flush I/O atau pembersihan sumber daya) sehingga kumpulan utas dapat mengalokasikan utas baru alih-alih menunggu yang ini.

  • Sebelum membongkar DLL yang menggunakan kumpulan utas, batalkan semua item kerja, I/O, operasi tunggu, dan timer, dan tunggu hingga panggilan balik dijalankan selesai.

  • Hindari kebuntuan dengan menghilangkan dependensi antara item kerja dan antara panggilan balik, dengan memastikan panggilan balik tidak menunggu dirinya selesai, dan dengan mempertahankan prioritas utas.

  • Jangan mengantre terlalu banyak item terlalu cepat dalam proses dengan komponen lain menggunakan kumpulan utas default. Ada satu kumpulan utas default per proses, termasuk Svchost.exe. Secara default, setiap kumpulan utas memiliki maksimum 500 utas pekerja. Kumpulan utas mencoba membuat lebih banyak utas pekerja ketika jumlah utas pekerja dalam status siap/berjalan harus kurang dari jumlah prosesor.

  • Hindari model apartemen berulir tunggal COM, karena tidak kompatibel dengan kumpulan utas. STA membuat status utas yang dapat memengaruhi item kerja berikutnya untuk utas. STA umumnya berumur panjang dan memiliki afinitas utas, yang merupakan kebalikan dari kumpulan utas.

  • Buat kumpulan utas baru untuk mengontrol prioritas dan isolasi utas, membuat karakteristik kustom, dan mungkin meningkatkan responsivitas. Namun, kumpulan utas tambahan memerlukan lebih banyak sumber daya sistem (utas, memori kernel). Terlalu banyak kumpulan meningkatkan potensi ketidakcocokan CPU.

  • Jika memungkinkan, gunakan objek yang dapat ditunda alih-alih mekanisme berbasis APC untuk memberi sinyal utas kumpulan utas. APC tidak berfungsi juga dengan utas kumpulan utas sebagai mekanisme sinyal lainnya karena sistem mengontrol masa pakai utas kumpulan utas, sehingga mungkin utas dihentikan sebelum pemberitahuan dikirimkan.

  • Gunakan ekstensi debugger kumpulan utas, !tp. Perintah ini memiliki penggunaan berikut:

    • benderaalamat kumpulan
    • benderaalamat obj
    • benderaalamat antrean
    • alamat waiter
    • alamat pekerja

    Untuk kumpulan, pelayan, dan pekerja, jika alamatnya nol, perintah akan mencadangkan semua objek. Untuk pelayan dan pekerja, menghilangkan alamat akan mencadangkan utas saat ini. Bendera berikut ditentukan: 0x1 (output baris tunggal), 0x2 (anggota cadangan), dan 0x4 (antrean kerja kumpulan cadangan).

Thread Pool API

Menggunakan Fungsi Kumpulan Utas