Bagikan melalui


Panggilan Prosedur Asinkron

Panggilan prosedur asinkron (APC) adalah fungsi yang dijalankan secara asinkron dalam konteks utas tertentu. Ketika APC diantrekan ke utas, sistem mengeluarkan gangguan perangkat lunak. Lain kali utas dijadwalkan, alur akan menjalankan fungsi APC. APC yang dihasilkan oleh sistem disebut APC mode kernel. APC yang dihasilkan oleh aplikasi disebut APC mode pengguna. Utas harus dalam status yang dapat diperingatkan untuk menjalankan APC mode pengguna.

Setiap utas memiliki antrean APC sendiri. Aplikasi mengantreKAN APC ke utas dengan memanggil fungsi QueueUserAPC . Utas panggilan menentukan alamat fungsi APC dalam panggilan ke QueueUserAPC. Antrean APC adalah permintaan untuk utas untuk memanggil fungsi APC.

Ketika APC mode pengguna diantrekan, utas yang diantrekan tidak diarahkan untuk memanggil fungsi APC kecuali dalam keadaan yang dapat diperingatkan. Utas memasuki status yang dapat diperingatkan saat memanggil fungsi SleepEx, SignalObjectAndWait, MsgWaitForMultipleObjectsEx, WaitForMultipleObjectsEx, atau WaitForSingleObjectEx . Jika penantian terpenuhi sebelum APC diantrekan, utas tidak lagi dalam status tunggu yang dapat diperingatkan sehingga fungsi APC tidak akan dijalankan. Namun, APC masih diantrekan, sehingga fungsi APC akan dijalankan ketika utas memanggil fungsi tunggu lain yang dapat diperingatkan.

Fungsi ReadFileEx, SetWaitableTimer, SetWaitableTimerEx, dan WriteFileEx diimplementasikan menggunakan APC sebagai mekanisme panggilan balik pemberitahuan penyelesaian.

Jika Anda menggunakan kumpulan utas, perhatikan bahwa APC tidak berfungsi serta mekanisme sinyal lainnya karena sistem mengontrol masa pakai utas kumpulan utas, sehingga mungkin utas dihentikan sebelum pemberitahuan dikirimkan. Alih-alih menggunakan mekanisme sinyal berbasis APC seperti parameter pfnCompletionRoutine dari SetWaitableTimer atau SetWaitableTimerEx, gunakan objek yang dapat ditunggu seperti timer yang dibuat dengan CreateThreadpoolTimer. Untuk I/O, gunakan objek penyelesaian I/O yang dibuat dengan CreateThreadpoolIo atau struktur TUMPANG TINDIH berbasis hEvent tempat peristiwa dapat diteruskan ke fungsi SetThreadpoolWait.

Sinkronisasi Internal

Ketika permintaan I/O dikeluarkan, struktur dialokasikan untuk mewakili permintaan. Struktur ini disebut paket permintaan I/O (IRP). Dengan I/O sinkron, utas membangun IRP, mengirimkannya ke tumpukan perangkat, dan menunggu di kernel agar IRP selesai. Dengan I/O asinkron, utas membangun IRP dan mengirimkannya ke tumpukan perangkat. Tumpukan mungkin segera menyelesaikan IRP, atau mungkin mengembalikan status tertunda yang menunjukkan bahwa permintaan sedang berlangsung. Ketika ini terjadi, IRP masih dikaitkan dengan utas, sehingga akan dibatalkan jika utas berakhir atau memanggil fungsi seperti CancelIo. Sementara itu, utas dapat terus melakukan tugas lain saat tumpukan perangkat terus memproses IRP.

Ada beberapa cara yang dapat ditunjukkan oleh sistem bahwa IRP telah selesai:

  • Perbarui struktur yang tumpang tindih dengan hasil operasi sehingga utas dapat melakukan polling untuk menentukan apakah operasi telah selesai.
  • Beri sinyal peristiwa dalam struktur yang tumpang tindih sehingga utas dapat disinkronkan pada peristiwa dan dibangunkan ketika operasi selesai.
  • Antrekan IRP ke APC utas yang tertunda sehingga utas akan menjalankan rutinitas APC ketika memasuki status tunggu yang dapat diperingatkan dan kembali dari operasi tunggu dengan status yang menunjukkan bahwa ia menjalankan satu atau beberapa rutinitas APC.
  • Antrekan IRP ke port penyelesaian I/O, di mana IRP akan dijalankan oleh utas berikutnya yang menunggu pada port penyelesaian.

Utas yang menunggu pada port penyelesaian I/O tidak menunggu dalam status yang dapat diperingatkan. Oleh karena itu, jika utas tersebut mengeluarkan runtime integrasi yang diatur untuk diselesaikan sebagai APC ke utas, penyelesaian IPC tersebut tidak akan terjadi tepat waktu; mereka hanya akan terjadi jika utas mengambil permintaan dari port penyelesaian I/O dan kemudian kebetulan memasukkan tunggu yang dapat diingat.

Menggunakan Timer yang Dapat Dinantikan dengan Panggilan Prosedur Asinkron