β’ Π¦Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π΅ΠΆΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ (alertable wait state), ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠ΅Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠΌ ΠΠ Π‘. ΠΠΎΡΡΠ΄ΠΎΠΊ ΠΏΠ΅ΡΠ²ΡΡ Π΄Π²ΡΡ ΡΠ°Π³ΠΎΠ² Π±Π΅Π·ΡΠ°Π·Π»ΠΈΡΠ΅Π½, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΉ ΡΠΎΡΡΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ.
β’ Π£ΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΠΉΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π²ΡΠ΅ ΠΠ Π‘, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΠ΅ΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ.
β’ ΠΠ Π‘ ΠΌΠΎΠ³ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π»ΡΠ±ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡ ΡΠ΅ΡΡΡΡΡ ΠΈΠ»ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ Π³Π»Π°Π²Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°ΡΡ Π²ΠΎΠ·Π±ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π² ΡΠ΅Π»Π΅Π²ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅, Ρ ΠΎΡΡ ΡΠ°ΠΌΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅Ρ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π΅ΠΆΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ.
ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΠ Π‘ ΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΌ Π² ΡΠΎΠΌ ΡΠΌΡΡΠ»Π΅, ΡΡΠΎ ΠΠ Π‘ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, Π½ΠΎ ΡΠ°ΠΌΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ Π² ΡΠΎΠΌ ΡΠΌΡΡΠ»Π΅, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ Π»ΠΈΡΡ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π²Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π΅ΠΆΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ.
Π‘ΠΎΡΡΠΎΡΠ½ΠΈΡ Π΄Π΅ΠΆΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π±ΡΠ΄ΡΡ Π²Π½ΠΎΠ²Ρ ΠΎΠ±ΡΡΠΆΠ΄Π°ΡΡΡΡ Π² Π³Π»Π°Π²Π΅ 14, ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π½ΠΎΠΉ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΌΡ Π²Π²ΠΎΠ΄Ρ/Π²ΡΠ²ΠΎΠ΄Ρ.
ΠΠΏΠΈΡΠ°Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² Π΄ΡΡΠ³ΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ThreeStage ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ°Π·Π΄Π΅Π»Π°Ρ . ΠΡΠΎΠ΅ΠΊΡ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (ThreeStageCancel) ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ (ThreeStageCancel. Ρ) Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π½Π° Web-ΡΠ°ΠΉΡΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ.
ΠΡΠ΅ΡΠ΅Π΄ΠΈΠ·Π°ΡΠΈΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΏΡΠΎΡΠ΅Π΄ΡΡ
ΠΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ (Π³Π»Π°Π²Π½ΡΠΉ) ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΠ Π‘ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ QueueUserAPC:
DWORD QueueUserAPC(PAPCFUNC pfnAPC, HANDLE hThread, DWORD dwData)
hThread β Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. dwData β Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΠ Π‘ ΠΏΡΠΈ Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠ²Π»ΡΡΡΡΡ ΠΊΠΎΠ΄ΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΠΎΠΎΠ±ΡΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ.
Π ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ThreeStageCancel.Ρ (ΡΡΠ°Π²Π½ΠΈΡΠ΅ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ 10.5) Π²ΡΠ·ΠΎΠ²Ρ TerminateThread Π·Π°ΠΌΠ΅Π½ΡΡΡΡΡ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ QueueUserAPC ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
// TerminateThread(transmitter_th, 0) ; Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π° ΠΠ Π‘
// TerminateThread(receiver_th, 0); Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π° ΠΠ Π‘
tstatus = QueueUserAPC(ShutDownTransmitter, transmitter_th, 1);
if (tstatus == 0) ReportError(β¦);
tstatus = QueueUserAPC(ShutDownReceiver, receiver_th, 2);
if (tstatus == 0) ReportError (β¦);
Π€ΡΠ½ΠΊΡΠΈΡ QueueUserAPC Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π΅Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΈΠ½Π°ΡΠ΅ β Π½ΡΠ»Ρ. Π ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ, ΡΡΠ½ΠΊΡΠΈΡ GetLastError () Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ ReportError Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π·Π°Π΄Π°Π²Π°ΡΡ ΡΠ΅ΠΊΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ (Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ FALSE).
pfnAPC β ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ, Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ ΡΠ΅Π»Π΅Π²ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ, Π²Π·ΡΡΡΠΉ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ThreeStageCancel. Ρ:
/* ΠΠ Π‘ Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ. */
void WINAPI ShutDownReceiver(DWORD n) {
printf("ΠΠ½ΡΡΡΠΈ ShutDownReceiver. %d\n", n);
/* ΠΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ Π²ΡΠ΅ ΡΠ΅ΡΡΡΡΡ (Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΎΡΡΡΡΡΡΠ²ΡΡΡ). */
return;
}
Π€ΡΠ½ΠΊΡΠΈΡ ShutDownTransmitter Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° Π²ΡΡΠ΅ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ, ΠΎΡΠ»ΠΈΡΠ°ΡΡΡ ΠΎΡ Π½Π΅Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΡΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. Π‘ΡΠ°Π·Ρ ΡΡΡΠ΄Π½ΠΎ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ, ΠΊΠ°Π·Π°Π»ΠΎΡΡ Π±Ρ, Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΡΡ Π΄Π°Π»Π΅Π΅ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅.
ΠΠ Π‘ ΠΈ ΡΠΏΡΡΠ΅Π½Π½ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ
ΠΠ Π‘, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΄ΡΠ° (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π°), ΠΌΠΎΠ³ΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΠΈΠ· ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ ΠΏΠΎΡΠ΅ΡΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² PulseEvent. Π ΡΠ²ΡΠ·ΠΈ Ρ ΡΡΠΈΠΌ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΡΠ΅ΡΠΈΡΡ ΡΠΎΠ²Π΅ΡΡ, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ PulseEvent ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, Ρ ΠΎΡΡ, ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ ΠΈ ΠΏΡΠΈΠ½ΠΎΡΠΈΡΡ ΠΏΠΎΠ»ΡΠ·Ρ. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ PulseEvent Π² Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ Π±ΡΠ»ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΠ Π‘, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΄ΡΠ°, Π² Π½ΠΈΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ SignalObjectAndWait ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½Π°Π΄Π΅ΠΆΠ½ΡΡ Π·Π°ΡΠΈΡΡ ΠΎΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΠΏΠΎΡΠ΅ΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ². ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΎΠΏΠ°ΡΠ°Π΅ΡΠ΅ΡΡ, ΡΡΠΎ ΡΡΠΎ Π²ΡΠ΅-ΡΠ°ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΡΠΈΡΡΡΡ, ΠΏΡΠΎΡΡΠΎ Π²ΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ.
Π‘ΠΎΡΡΠΎΡΠ½ΠΈΡ Π΄Π΅ΠΆΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ
ΠΠΎ Π²ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° bAlertable, ΡΠ²Π»ΡΡΡΠ΅Π³ΠΎΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ SignalObjectAndWait, ΠΏΠΎΠ»Π°Π³Π°Π»ΠΎΡΡ ΡΠ°Π²Π½ΡΠΌ FALSE. ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²ΠΌΠ΅ΡΡΠΎ Π½Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ TRUE, ΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ, ΡΡΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ, ΠΊΠ°ΠΊ Π³ΠΎΠ²ΠΎΡΡΡ, Π΄Π΅ΠΆΡΡΠ½ΡΠΌ (alertable), ΠΈ ΡΠΎΠ³Π΄Π° ΠΏΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅Ρ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π΅ΠΆΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ. Π ΡΡΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊ Π²Π΅Π΄Π΅Ρ ΡΠ΅Π±Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
β’ ΠΡΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΠ Π‘ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΠΎΡΠΎΠΊΠ° (ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ QueueUserAPC) Π΅ΡΠ΅ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ hObjectToWaitOn (ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠ±ΡΡΠΈΠ΅), ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅Ρ Π² ΡΠΈΠ³Π½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, Π»ΠΈΠ±ΠΎ ΠΈΡΡΠ΅ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, ΡΠΎ Π²ΡΠ΅ ΡΡΠΈ ΠΏΠΎΡΠΎΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ (ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ), Π° ΡΡΠ½ΠΊΡΠΈΡ SignalObjectAndWait Π·Π°Π²Π΅ΡΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ WAIT_IO_COMPLETED.
β’ ΠΡΠ»ΠΈ ΠΠ Π‘ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°Π»ΠΈΡΡ, ΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ SignalObjectAndWait Π²Π΅Π΄Π΅Ρ ΡΠ΅Π±Ρ ΠΎΠ±ΡΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠΎ Π΅ΡΡΡ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΡΠΈΠ³Π½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ.
Π‘ΠΎΡΡΠΎΡΠ½ΠΈΡ Π΄Π΅ΠΆΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π±ΡΠ΄ΡΡ Π²Π½ΠΎΠ²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π°ΠΌΠΈ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π° (Π³Π»Π°Π²Π° 14); ΠΈΠΌΠ΅Π½Π½ΠΎ Π² ΡΠ²ΡΠ·ΠΈ Ρ ΡΡΠΈΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎ ΡΠ²ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ WAIT_IO_COMPLETED. Π ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π΅ΠΆΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡ ΡΠ°ΠΊΠΆΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ WaitForSingleObjectEx, WaitForMultipleObjectsEx ΠΈ SleepEx, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌΠΈ ΠΈ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π°.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ q_get ΠΈ q_put (ΡΠΌ. ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ 10.4) ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΠ Π‘ Π±ΡΠ»ΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΌ, Ρ ΠΎΡΡ ΠΠ Π‘-ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΈΠ½ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ, ΠΊΡΠΎΠΌΠ΅ Π²ΡΠ²ΠΎΠ΄Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠ΅, ΡΡΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ β ΡΡΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ Π²Ρ ΠΎΠ΄ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π΅ΠΆΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ SignalObjectAndWait, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ q_get (ΡΠΌ. ΡΠ°ΠΉΠ» QueueObjCancel.Ρ, Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΠΉΡΡ Π½Π° Web-ΡΠ°ΠΉΡΠ΅).
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 10.6. ΠΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ q_get, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠ°Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²DWORD q_put(queue_t *q, PVOID msg, DWORD msize, DWORD MaxWait) {
BOOL Cancelled = FALSE;
if (q_destroyed(q)) return 1;
WaitForSingleObject(q->q_guard, INFINITE);
while (q_full(q) && !Cancelled) {
if (SignalObjectAndWait(q->q_guard, q->q_nf, INFINITE, TRUE) == WAIT_IO_COMPLETION) {
Cancelled = TRUE;
continue;
}
WaitForSingleObject(q->q_guard, INFINITE);
}
/* ΠΠΎΠΌΠ΅ΡΡΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ. */
if (!Cancelled) {
q_remove(q, msg, msize);
/* Π‘ΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΡΠ΄Π°Π»ΠΈΠ»ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. */
PulseEvent(q->q_nf);
ReleaseMutex(q->q_guard);
}
return Cancelled ? WAIT_TIMEOUT : 0;
}
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΠ Π‘ ΠΌΠΎΠ³ΡΡ Π²ΡΡΡΡΠΏΠ°ΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ShutDownReceiver, ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ShutDownTransmitter, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΠΈΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ q_get, ΡΠ°ΠΊ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ q_put. ΠΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π±ΡΠ»ΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΎΠ½ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ, ΠΏΡΠΈΠΌΠ΅Π½ΡΠΉΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ ΠΠ Π‘, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΡΠ΅ΡΡΠΈΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ QueueUserAPC Π²ΠΎ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ΅ ΠΊΠΎΠ΄Π°, ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ 10.6.
Π§ΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠΎΠ΄Π° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ WAIT_TIMEOUT.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ° Π²ΠΌΠ΅ΡΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ WAIT_IO_COMPLETION ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΡΠ΅Π»ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ q_put Π² try-Π±Π»ΠΎΠΊ, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ.
ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½Π°Ρ ΠΎΡΠΌΠ΅Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°Π»ΠΎ, ΠΊΠ°ΠΊ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΠΎΡΠΌΠ΅Π½ΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π΄Π΅ΠΆΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ. ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΠ Π‘, ΡΠ°ΠΊΡΡ ΠΎΡΠΌΠ΅Π½Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·ΡΠ²Π°ΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΉ ΠΎΡΠΌΠ΅Π½ΠΎΠΉ (synchronous cancellation), ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠΌΠ΅Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°Π» Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ QueueUserAPC Π³Π»Π°Π²Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, ΡΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡΡΡ Π»ΠΈΡΡ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΡΠ΅Π»Π΅Π²ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎΡΡΠΈΠ³Π½Π΅Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π΄Π΅ΠΆΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ.
Π‘ΠΈΠ½Ρ ΡΠΎΠ½Π½Π°Ρ ΠΎΡΠΌΠ΅Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΠ°ΡΡΠΈΡ Π² ΡΡΠΎΠΌ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ΅ΠΌΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΡΡ Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π΅ΠΆΡΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎΠ±ΡΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π²Π½ΠΎΠ²Ρ Π² ΡΠΈΠ³Π½Π°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ² ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π² Π΄Π΅ΠΆΡΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅, ΡΡΠΎΠ±Ρ ΡΡΠ΅ΡΡΡ ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΡΠ΅ΡΡΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²Π½ΠΎΠ²Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ. ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π³Π»Π°Π²Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π΄Π»Ρ ΡΠ°Π·ΡΡΡΠ΅Π½ΠΈΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ².