Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 85

Автор ДТонсон Π₯Π°Ρ€Ρ‚

β€’ Π¦Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС Π΄Π΅ΠΆΡƒΡ€Π½ΠΎΠ³ΠΎ оТидания (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 Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, смоТСт ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒΡΡ лишь Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ достигнСт бСзопасного состояния Π΄Π΅ΠΆΡƒΡ€Π½ΠΎΠ³ΠΎ оТидания.

Бинхронная ΠΎΡ‚ΠΌΠ΅Π½Π° выполнСния Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ участия Π² этом Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, которая врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ЕстСствСнный способ вхоТдСния Π² состояниС Π΄Π΅ΠΆΡƒΡ€Π½ΠΎΠ³ΠΎ оТидания ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания событий, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² процСссС прСкращСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ систСмы ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ события ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ вновь Π² сигнальноС состояниС. ОТиданиС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π² Π΄Π΅ΠΆΡƒΡ€Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ‡Π΅ΡΡ‚ΡŒ Ρ‚Π΅ случаи, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ рСсурса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ вновь доступным. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ для Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².