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

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

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

Один ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ»Ρ‹ оТидания ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° CRITI-CAL_SECTION, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

/* УмСньшаСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика сСмафора Π½Π° 2. */

EnterCriticalSection(&csSem);

WaitForSingleObject(hSem, INFINITE);

WaitForSingleObject(hSem, INFINITE);

LeaveCriticalSection (&csSem);

…

ReleaseSemaphore(hSem, 2, &PrevCount);

Но ΠΈ эта рСализация, Π² Ρ‚Π°ΠΊΠΎΠΌ ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅, страдаСт ограничСниями. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Π² счСтчикС сСмафора остаСтся Π΄Π²Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΡƒ А Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ Ρ‚Ρ€ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, Π° ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π’ β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π΅. Если ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π½Π°Ρ‡Π½Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎΡ‚ΠΎΠΊ А, Ρ‚ΠΎ ΠΎΠ½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π΄Π²Π° Ρ†ΠΈΠΊΠ»Π° оТидания ΠΈ блокируСтся Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ, продолТая Π²Π»Π°Π΄Π΅Ρ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ. ΠŸΡ€ΠΈ этом ΠΏΠΎΡ‚ΠΎΠΊ Π’, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±Ρ‹Π»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ.

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

ПолноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ мноТСствСнных Ρ†ΠΈΠΊΠ»ΠΎΠ² оТидания прСдлагаСтся Π² ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 10.11. 

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сСмафоры Windows Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅, Ссли Π±Ρ‹ сущСствовала Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ мноТСствСнныС Ρ†ΠΈΠΊΠ»Ρ‹ оТидания Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠΉ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (atomic multiple-wait operation).

Бобытия

ПослСдним ΠΈΠ· рассматриваСмых Π½Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² синхронизации ядра ΡΠ²Π»ΡΡŽΡ‚ΡΡ события (events). ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ события ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ ΠΎ наступлСнии ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ события, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎ появлСнии Π½ΠΎΠ²ΠΎΠ³ΠΎ сообщСния.

Π’Π°ΠΆΠ½ΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ, обСспСчиваСмой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ событий, являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² сигнальноС состояниС СдинствСнного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° события способСн вывСсти ΠΈΠ· состояния оТидания ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ события дСлятся Π½Π° сбрасываСмыС Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈ автоматичСски сбрасываСмыС, ΠΈ это ΠΈΡ… свойство устанавливаСтся ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateEvent.

β€’ Π‘брасываСмыС Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ события (manual-reset events) ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ всСм ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΌ наступлСния этого события, ΠΈ пСрСводятся Π² нСсигнальноС состояниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ.

β€’ ΠΠ²Ρ‚оматичСски сбрасываСмыС события (auto-reset event) ΡΠ±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ послС освобоТдСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° события Π² сигнальноС состояниС.

Бобытия ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: CreateEvent, OpenEvent, SetEvent, ResetEvent ΠΈ CreateEvent. 

HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpsa, BOOL bManualReset, BOOL bInitialState, LPTCSTR lpEventName) 

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ событиС, сбрасываСмоС Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° bManualReset Ρ€Π°Π²Π½Ρ‹ΠΌ True. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС события ΡΠΈΠ³Π½Π°Π»ΡŒΠ½Ρ‹ΠΌ, установитС Ρ€Π°Π²Π½Ρ‹ΠΌ True Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° bInitialState. Для открытия ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° события ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция OpenEvent, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ процСсс.

Для управлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ событий ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 

BOOL SetEvent(HANDLE hEvent)

BOOL ResetEvent(HANDLE hEvent)

BOOL PulseEvent(HANDLE hEvent) 

ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ событиС Π² сигнальноС состояниС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SetEvent. Если событиС являСтся автоматичСски сбрасываСмым, Ρ‚ΠΎ ΠΎΠ½ΠΎ автоматичСски возвращаСтся Π² нСсигнальноС состояниС ΡƒΠΆΠ΅ послС освобоТдСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π’ отсутствиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… наступлСния этого события, ΠΎΠ½ΠΎ остаСтся Π² сигнальном состоянии Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ появится, послС Ρ‡Π΅Π³ΠΎ этот ΠΏΠΎΡ‚ΠΎΠΊ сразу ΠΆΠ΅ освобоТдаСтся. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Π΅Π΄Π΅Ρ‚ сСбя сСмафор, максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ установлСно Ρ€Π°Π²Π½Ρ‹ΠΌ 1.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли событиС являСтся сбрасываСмым Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Ρ‚ΠΎ ΠΎΠ½ΠΎ остаСтся Π² сигнальном состоянии Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ResetEvent, ΡƒΠΊΠ°Π·Π°Π² дСскриптор этого события Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π’ это врСмя всС ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ, Π½ΠΎ Π΄ΠΎ выполнСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ сброса события Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² состояниС Π΅Π³ΠΎ оТидания, Ρ‚Π°ΠΊ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ.

Ѐункция PulseEvent освобоТдаСт всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ наступлСния сбрасываСмого Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ события, Π½ΠΎ послС этого событиС сразу ΠΆΠ΅ автоматичСски сбрасываСтся. Π’ случаС ΠΆΠ΅ использования автоматичСски сбрасываСмого события функция PulseEvent освобоТдаСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π₯отя Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΌΠ½ΠΎΠ³ΠΈΡ… Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ Π΄Π°ΠΆΠ΅ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… Microsoft (см. примСчания Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ MSDN, содСрТащСм описаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PulseEvent) рСкомСндуСтся ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PulseEvent, Π»ΠΈΡ‡Π½ΠΎ я ΡΡ‡ΠΈΡ‚Π°ΡŽ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ, Π½ΠΎ ΠΈ сущСствСнно Π²Π°ΠΆΠ½ΠΎΠΉ, ΠΊΠ°ΠΊ это слСдуСт ΠΈΠ· обсуТдСния многочислСнных ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² Π΄Π²ΡƒΡ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ….

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ функция PulseEvent становится ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ лишь послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ сбрасываСмоС Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ событиС установлСно Π² сигнальноС состояниС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetEvent. Π‘ΡƒΠ΄ΡŒΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WaitForMultipleObjects для оТидания ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π² сигнальноС состояниС всСх событий. ΠžΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ освободится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ всС события Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² сигнальном состоянии, ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· событий, находящихся Π² сигнальном состоянии, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½Ρ‹, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊ освободится.

Π’ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 8.5 Π²Π°ΠΌ прСдлагаСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ sortMT (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 7.2) Π·Π° счСт использования Π² Π½Π΅ΠΉ событий. 

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ условий (condition variables) Pthreads Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ стСпСни сравнимы с событиями, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² сочСтании с ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°ΠΌΠΈ. Π’Π°ΠΊΠΎΠΉ способ ΠΈΡ… использования Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ являСтся ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΠ΄ΠΎΡ‚Π²ΠΎΡ€Π½Ρ‹ΠΌ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ описан Π² Π³Π»Π°Π²Π΅ 10. Для создания ΠΈ уничтоТСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ условий ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, соотвСтствСнно, систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ pthread_cond_init ΠΈ pthread_cond_destroy. Ѐункциями оТидания ΡΠ²Π»ΡΡŽΡ‚ΡΡ pthread_cond_wait ΠΈ pthread_cond_timedwait. БистСмный Π²Ρ‹Π·ΠΎΠ² pthread_cond_signal осущСствляСт Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ послС освобоТдСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Windows-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PulseEvent Π² случаС автоматичСски сбрасываСмых событий, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ² pthread_cond_broadcast сигнализируСт всСм ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ, ΠΈ поэтому Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PulseEvent, примСняСмой ΠΊ сбрасываСмому Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡΠΎΠ±Ρ‹Ρ‚ΠΈΡŽ. Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ PulseEvent ΠΈ ResetEvent, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² случаС сбрасываСмых Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ событий, Π½Π΅ сущСствуСт.

ΠžΠ±Π·ΠΎΡ€: Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ использования событий

ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ автоматичСски сбрасываСмых ΠΈ сбрасываСмых Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ событий с функциями SetEvent ΠΈ PulseEvent ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ способам использования событий. КаТдая ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Π° ΠΈ каТдая ΠΈΠ· Π½ΠΈΡ… оказываСтся ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ Π² Ρ‚ΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ситуации, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ всС ΠΎΠ½ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΈ упраТнСниях, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² этой ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π°Ρ….

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅ΠΆΠ΅Π½ΠΈΠ΅

НСкоррСктноС использованиС событий ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ возникновСнию условий состязаний, Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΎΠ½ΠΊΠΈΡ…, Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ошибок. Π’ Π³Π»Π°Π²Π΅ 10 ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠΈ, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΡ‡Ρ‚ΠΈ Π²ΠΎ всСх случаях использования событий, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ самых Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ….

Π’ Ρ‚Π°Π±Π». 8.1 описаны Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ситуации.


Π’Π°Π±Π»ΠΈΡ†Π° 8.1. Бводная Ρ‚Π°Π±Π»ΠΈΡ†Π° свойств событий 


АвтоматичСски сбрасываСмыС события БбрасываСмыС Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ события SetEvent ΠžΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ‚ΡΡ строго ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ. Если Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ наступлСния события, Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² состояниС оТидания ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… событий, Π±ΡƒΠ΄Π΅Ρ‚ сразу ΠΆΠ΅ освобоТдСн. ПослС этого событиС Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ автоматичСски сбрасываСтся. ΠžΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² настоящСС врСмя ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ наступлСния события. Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ остаСтся Π² сигнальном состоянии Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. PulseEvent ΠžΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ‚ΡΡ строго ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли имССтся ΠΏΠΎΡ‚ΠΎΠΊ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ наступлСния события. ΠžΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ наступлСния события, Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ, послС Ρ‡Π΅Π³ΠΎ событиС сбрасываСтся ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² нСсигнальноС состояниС. 

ΠžΠ±Ρ€Π°Π·Π½ΠΎ говоря, автоматичСски сбрасываСмоС событиС β€” это Π΄Π²Π΅Ρ€ΡŒ, снабТСнная ΠΏΡ€ΡƒΠΆΠΈΠ½ΠΎΠΉ, которая обСспСчиваСт автоматичСскоС Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π΄Π²Π΅Ρ€ΠΈ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ сбрасываСмоС событиС ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΠΎΠ΄ΠΎΠ±ΠΈΡ‚ΡŒ Π΄Π²Π΅Ρ€ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΡƒΠΆΠΈΠ½Π° отсутствуСт ΠΈ которая, Π±ΡƒΠ΄ΡƒΡ‡ΠΈ Ρ€Π°Π· ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π² Ρ‚Π°ΠΊΠΎΠΌ состоянии. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эту ΠΌΠ΅Ρ‚Π°Ρ„ΠΎΡ€Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ функция PulseEvent ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΄Π²Π΅Ρ€ΡŒ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΅Π΅ сразу ΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π΅ проходят ΠΎΠ΄Π½Π° (автоматичСски сбрасываСмыС события) ΠΈΠ»ΠΈ всС (Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ сбрасываСмыС события) ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. Ѐункция SetEvent ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΄Π²Π΅Ρ€ΡŒ ΠΈ освобоТдаСт Π΅Π΅.