Pengumpulan Utas
Ada banyak aplikasi yang membuat utas yang menghabiskan banyak waktu dalam keadaan tidur menunggu peristiwa terjadi. Utas lain dapat memasuki status tidur hanya untuk dibangunkan secara berkala ke polling untuk informasi status perubahan atau pembaruan. Pengumpulan utas memungkinkan Anda menggunakan utas secara lebih efisien dengan menyediakan kumpulan utas pekerja yang dikelola oleh sistem kepada aplikasi Anda. Setidaknya satu utas memantau status semua operasi tunggu yang diantrekan ke kumpulan utas. Ketika operasi tunggu telah selesai, utas pekerja dari kumpulan utas menjalankan fungsi panggilan balik yang sesuai.
Topik ini menjelaskan API kumpulan utas asli. API kumpulan utas yang diperkenalkan di Windows Vista lebih sederhana, lebih andal, memiliki performa yang lebih baik, dan memberikan lebih banyak fleksibilitas bagi pengembang. Untuk informasi tentang API kumpulan utas saat ini, lihat Kumpulan Utas.
Anda juga dapat mengantre item kerja yang tidak terkait dengan operasi tunggu ke kumpulan utas. Untuk meminta agar item kerja ditangani oleh utas di kumpulan utas, panggil fungsi QueueUserWorkItem . Fungsi ini mengambil parameter ke fungsi yang akan dipanggil oleh utas yang dipilih dari kumpulan utas. Tidak ada cara untuk membatalkan item kerja setelah diantrekan.
Timer-queue timer dan operasi tunggu terdaftar juga menggunakan kumpulan utas. Fungsi panggilan balik mereka diantrekan ke kumpulan utas. Anda juga dapat menggunakan fungsi BindIoCompletionCallback untuk memposting operasi I/O asinkron. Setelah menyelesaikan I/O, panggilan balik dijalankan oleh utas kumpulan utas.
Kumpulan utas dibuat saat pertama kali Anda memanggil QueueUserWorkItem atau BindIoCompletionCallback, atau saat timer-queue timer atau operasi tunggu terdaftar mengantrekan fungsi panggilan balik. Secara default, jumlah utas yang dapat dibuat di kumpulan alur adalah sekitar 500. Setiap utas menggunakan ukuran tumpukan default dan berjalan pada prioritas default.
Ada dua jenis utas pekerja di kumpulan utas: I/O dan non-I/O. Utas pekerja I/O adalah utas yang menunggu dalam status tunggu yang dapat diperingatkan. Item kerja diantrekan ke utas pekerja I/O sebagai panggilan prosedur asinkron (APC). Anda harus mengantre item kerja ke utas pekerja I/O jika harus dijalankan dalam utas yang menunggu dalam status yang dapat diperingatkan.
Utas pekerja non-I/O menunggu pada port penyelesaian I/O. Menggunakan utas pekerja non-I/O lebih efisien daripada menggunakan utas pekerja I/O. Oleh karena itu, Anda harus menggunakan utas pekerja non-I/O jika memungkinkan. Utas pekerja I/O dan non-I/O tidak keluar jika ada permintaan I/O asinkron yang tertunda. Kedua jenis utas dapat digunakan oleh item kerja yang memulai permintaan penyelesaian I/O asinkron. Namun, hindari memposting permintaan penyelesaian I/O asinkron di utas pekerja non-I/O jika dapat memakan waktu lama untuk diselesaikan.
Untuk menggunakan pengumpulan utas, item kerja dan semua fungsi yang mereka sebut harus aman untuk kumpulan utas. Fungsi yang aman tidak mengasumsikan bahwa utas yang mengeksekusinya adalah utas khusus atau persisten. Secara umum, Anda harus menghindari penggunaan penyimpanan lokal utas atau melakukan panggilan asinkron yang memerlukan utas persisten, seperti fungsi RegNotifyChangeKeyValue . Namun, fungsi tersebut dapat dipanggil pada utas khusus (dibuat oleh aplikasi) atau diantrekan ke utas pekerja persisten (menggunakan QueueUserWorkItem dengan opsi WT_EXECUTEINPERSISTENTTHREAD).
Topik terkait