Bagikan melalui


Pengumpulan Utas

Ada banyak aplikasi yang membuat utas yang menghabiskan banyak waktu dalam keadaan tidur menunggu peristiwa terjadi. Utas lain dapat memasuki keadaan tidur dan hanya dibangunkan secara berkala untuk memeriksa adanya perubahan atau pembaruan informasi status. 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 dari semua operasi tunggu yang ditambahkan ke dalam kumpulan utas. Ketika operasi tunggu telah selesai, utas pekerja dari kumpulan utas mengoperasikan fungsi callback yang sesuai.

Topik ini menjelaskan API thread pool 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 dalam thread pool. Untuk meminta agar item kerja ditangani oleh utas di kumpulan utas, panggil fungsi QueueUserWorkItem. Fungsi ini menerima parameter untuk fungsi yang akan dipanggil oleh utas yang dipilih dari kumpulan utas. Tidak ada cara untuk membatalkan item kerja setelah diantrekan.

antrean timer dan operasi tunggu yang terdaftar juga menggunakan kumpulan utas. Fungsi callback mereka diantrekan ke pool thread. Anda juga dapat menggunakan fungsi BindIoCompletionCallback untuk memposting operasi I/O asinkron. Setelah penyelesaian I/O, panggilan balik dijalankan oleh utas di kumpulan utas.

Kumpulan utas dibuat pertama kali Anda memanggil QueueUserWorkItem atau BindIoCompletionCallback, atau ketika timer-queue timer atau operasi tunggu terdaftar mengantrekan fungsi panggilan balik. Secara default, jumlah utas yang dapat dibuat di kumpulan utas 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 dengan cara panggilan prosedur yang asinkron (APC). Anda harus mengantrekan item kerja ke utas pekerja I/O jika harus dijalankan dalam utas yang menunggu dalam status siaga.

Utas kerja 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. Thread pekerja I/O dan non-I/O tidak berhenti jika ada permintaan I/O asinkron yang masih tertunda. Kedua jenis utas dapat digunakan oleh unit 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 dengan efektif, item kerja dan semua fungsi yang mereka panggil 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 fungsiRegNotifyChangeKeyValue. Namun, fungsi tersebut dapat dipanggil pada utas khusus (dibuat oleh aplikasi) atau diantrekan ke utas pekerja persisten (menggunakan QueueUserWorkItem dengan opsi WT_EXECUTEINPERSISTENTTHREAD).

I/O yang Dapat Menghasilkan Peringatan

Panggilan Prosedur Asinkron

Port Penyelesaian I/O

Kumpulan Utas