Aracılığıyla paylaş


Zaman Uyumsuz Yordam Çağrıları

zaman uyumsuz yordam çağrısı (APC), belirli bir iş parçacığı bağlamında zaman uyumsuz olarak yürütülen bir işlevdir. Bir APC bir iş parçacığına kuyruğa alındığında, sistem bir yazılım kesintisi oluşturur. İş parçacığı bir sonraki zamanlandığında APC işlevini çalıştırır. Sistem tarafından oluşturulan bir APC, çekirdek modu APColarak adlandırılır. Bir uygulama tarafından oluşturulan APC, kullanıcı modu APColarak adlandırılır. Kullanıcı modu APC'sini çalıştırmak için iş parçacığının uyarılabilir durumda olması gerekir.

Her iş parçacığının kendi APC kuyruğu vardır. Uygulama, QueueUserAPC işlevini çağırarak bir APC'yi iş parçacığına kuyruğa alır. Çağıran iş parçacığı, QueueUserAPCçağrısında bir APC işlevinin adresini belirtir. APC'nin kuyruğa alma işlemi, iş parçacığının APC işlevini çağırması için bir istektir.

Kullanıcı modu APC kuyruğa alındığında, kuyruğa alınan iş parçacığı, uyarılabilen bir durumda olmadığı sürece APC işlevini çağırmaya yönlendirilmez. İş parçacığı, SleepEx, SignalObjectAndWait, MsgWaitForMultipleObjectsEx, WaitForMultipleObjectsExveya WaitForSingleObjectExişleviniçağırdığında uyarılabilir bir duruma girer. APC kuyruğa alınmadan önce bekleme işlemi karşılanırsa, iş parçacığı artık uyarılabilen bir bekleme durumunda değildir, bu nedenle APC işlevi yürütülmeyecektir. Ancak, APC hala kuyruğa alınır, bu nedenle iş parçacığı başka bir uyarılabilir bekleme işlevini çağırdığında APC işlevi yürütülür.

ReadFileEx, SetWaitableTimer, SetWaitableTimerExve WriteFileEx işlevleri, tamamlama bildirimi geri çağırma mekanizması olarak bir APC kullanılarak uygulanır.

biriş parçacığı havuzu kullanıyorsanız, sistem iş parçacığı havuzu iş parçacıklarının ömrünü denetlediğinden, bildirim teslim edilmeden önce iş parçacığının sonlandırılabilmesi için API'lerin yanı sıra diğer sinyal mekanizmalarının da çalışmadığını unutmayın. SetWaitableTimer veya SetWaitableTimerEx'in pfnCompletionRoutine parametresi gibi APC tabanlı bir sinyal mekanizması kullanmak yerine, CreateThreadpoolTimerile oluşturulan zamanlayıcı gibi bir beklenebilir nesne kullanın. G/Ç için, CreateThreadpoolIo veya olayın SetThreadpoolWait işlevine geçirilebildiği hEventtabanlı OVERLAPPED yapısıyla oluşturulan G/Ç tamamlama nesnesini kullanın.

Eşitleme İçleri

G/Ç isteği yayımlandığında, isteği temsil etmek için bir yapı ayrılır. Bu yapıya G/Ç istek paketi (IRP) adı verilir. Zaman uyumlu G/Ç ile iş parçacığı IRP'yi oluşturur, cihaz yığınına gönderir ve IRP'nin tamamlanmasını çekirdekte bekler. Zaman uyumsuz G/Ç ile iş parçacığı IRP'yi oluşturur ve cihaz yığınına gönderir. Yığın IRP'yi hemen tamamlayabilir veya isteğin devam ettiğini belirten bir bekleme durumu döndürebilir. Bu durumda, IRP iş parçacığıyla ilişkilendirilir, bu nedenle iş parçacığı sonlandırılırsa veya CancelIogibi bir işlevi çağırırsa iptal edilir. Bu arada, cihaz yığını IRP'yi işlemeye devam ederken iş parçacığı diğer görevleri gerçekleştirmeye devam edebilir.

Sistemin IRP'nin tamamlandığını belirtmesinin birkaç yolu vardır:

  • İş parçacığının işlemin tamamlanıp tamamlanmadığını belirleyebilmesi için çakışan yapıyı işlemin sonucuyla güncelleştirin.
  • Bir iş parçacığının olay üzerinde eşitlenebilmesi ve işlem tamamlandığında uyandırılabilmesi için çakışan yapıdaki olayı işaretleyin.
  • IRP'yi iş parçacığının bekleyen APC'sine sıralayın, böylece iş parçacığı uyarılabilen bir bekleme durumuna girdiğinde APC yordamını yürütür ve bekleme işleminden bir veya daha fazla APC yordamı yürüttüğünü belirten bir durumla döner.
  • IRP'yi bir G/Ç tamamlama bağlantı noktasına sıralayın; burada tamamlama bağlantı noktasında bekleyen bir sonraki iş parçacığı tarafından yürütülür.

G/Ç tamamlama bağlantı noktasında bekleyen iş parçacıkları, uyarılabilen bir durumda beklemez. Bu nedenle, bu iş parçacıkları iş parçacığına APC olarak tamamlanmak üzere ayarlanmış IRP'ler verirse, bu IPC tamamlamaları zamanında gerçekleşmez; bunlar yalnızca iş parçacığı G/Ç tamamlama bağlantı noktasından bir istek alır ve sonra uyarılabilen bir bekleme girerse gerçekleşir.

Zaman Uyumsuz Yordam Çağrısı ile Beklenebilir Süreölçer Kullanma