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

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

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

Однако Π² случаС Windows NT 5.x (XP, 2000 ΠΈ Server 2003) ΠΈ Π΄Π°ΠΆΠ΅ Windows NT 4.0 ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SignalObjectAndWait β€” Π²Π°ΠΆΠ½Ρ‹ΠΉ элСмСнт ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ избавляСт ΠΎΡ‚ нСобходимости примСнСния ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ² оТидания ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ освобоТдСниС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ события. ΠŸΡ€ΠΈ этом ΠΊΡ€ΠΎΠΌΠ΅ явного упрощСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ устранСниСм систСмного Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ отсутствиСм нСобходимости Π² настройкС Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° оТидания. 

DWORD SignalObjectAndWait(HANDLE hObjectToSignal, HANDLE hObjectToWaitOn, DWORD dwMilliseconds, BOOL bAlertable) 

Π­Ρ‚Π° функция, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ дСскрипторы, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ соотвСтствСнно Π½Π° ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈ событиС, ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ†ΠΈΠΊΠ» потрСбитСля. Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π» оТидания здСсь отсутствуСт, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ оТиданию Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ дСскриптора сразу ΠΆΠ΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ дСскриптор ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² сигнальноС состояниС (Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ освобоТдСниС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°). ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² сигнальноС состояниС ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ оТиданию ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ΡΡ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π° ΠΎΠ΄Π½Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎ наступлСнии события Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ освобоТдСниСм ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈ оТидания ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ события, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ дСскриптор. Π’ΠΎΠ³Π΄Π° ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» потрСбитСля ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

while (!cvp(&State)) {

 SignalObjectAndWait(State.Guard, State.CvpSet, INFINITE, FALSE);

 WaitForSingleObject (State.Guard, INFINITE);

}

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ послСднСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, bAlertable, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС являСтся FALSE, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…, посвящСнных Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ АРБ, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Ρ€Π°Π²Π½Ρ‹ΠΌ TRUE.

Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, ΠΎΠ±Π° дСскриптора ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Π»ΡŽΠ±Ρ‹Π΅ подходящиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ синхронизации. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ CRITICAL_SECTION Π² качСствС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, сигнальноС состояниС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ отслСТиваСтся, нСльзя, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ допустимыми ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ядра.

Ѐункция SignalObjectAndWait примСняСтся Π²ΠΎ всСх ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, прСдставлСнных ΠΊΠ°ΠΊ Π² ΠΊΠ½ΠΈΠ³Π΅, Ρ‚Π°ΠΊ ΠΈ Π½Π° Web-сайтС, хотя Π½Π° Web-сайтС находятся ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΡΡ Π² тСкстС. Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Windows 9x, Ρ‚ΠΎ слСдуСт Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠ°Ρ€ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ "сигнал/ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅", ΠΊΠ°ΠΊ Π² ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π°, ΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» оТидания.

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅, посвящСнном АРБ, прСдставлСны Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сигналов ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ сигналов Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² случаС событий простых способов, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Π½Π°ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ сигналы, Π½Π΅ сущСствуСт.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΡΡ‚Π°Π²Π°Π»ΠΈΡΡŒ Π² состоянии оТидания ΠΈ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° количСство Ρ‚Π°ΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ станСт достаточным для образования Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹, способной Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² достигаСт ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ значСния, всС ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, Π° ΠΏΠΎΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ впослСдствии Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±Π΅Π· оТидания. Π­Ρ‚Ρƒ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ создания слоТного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€Π° (threshold barrier compound object).

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… 10.1 ΠΈ 10.2 прСдставлСна рСализация Ρ‚Ρ€Π΅Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… слоТный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°. Π”Π²Π΅ ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, CreateThresholdBarrier ΠΈ CloseThresholdBarrier, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ THB_HANDLE, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌΠΈ дСскрипторам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π° протяТСнии всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»ΠΈΡΡŒ Π½Π°ΠΌΠΈ вмСстС с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ядра. ΠŸΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ΅ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² являСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateThresholdBarrier. 

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 10.1 прСдставляСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, SynchObj.h, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 10.2 β€” Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ‚Ρ€Π΅Ρ… упомянутых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Π°Ρ€ΡŒΠ΅Ρ€Π° содСрТит ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, событиС, счСтчик ΠΈ ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ условия Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, событиС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика достигаСт ΠΈΠ»ΠΈ становится большС ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ значСния.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 10.1. SynchObj.h: Ρ‡Π°ΡΡ‚ΡŒ 1 β€” объявлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€Π° 

/* Π“Π»Π°Π²Π° 10. Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ синхронизации. */

#define CV_TIMEOUT 50 /* НастраиваСмый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ для ΠΌΠΎΠ΄Π΅Π»ΠΈ CV. */

/* ΠžΠ‘ΠͺΠ•ΠšΠ’ ΠŸΠžΠ ΠžΠ“ΠžΠ’ΠžΠ“Πž БАРЬЕРА β€” ΠžΠŸΠ Π•Π”Π•Π›Π•ΠΠ˜Π• ВИПА И ПРОВОВИПЫ Π€Π£ΠΠšΠ¦Π˜Π™. */

typedef struct THRESHOLD_BARRIER_TAG { /* ΠŸΠΎΡ€ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Π±Π°Ρ€ΡŒΠ΅Ρ€. */

 HANDLE b_guard; /* ΠœΡŒΡŽΡ‚Π΅ΠΊΡ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. */

 HANDLE b_broadcast; /* Π’Ρ€ΡƒΡ‡Π½ΡƒΡŽ сбрасываСмоС событиС: b_count >= b_threshold.*/

 volatile DWORD b_destroyed; /* Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ послС закрытия. */

 volatile DWORD b_count; /* ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄ΠΎ достиТСния Π±Π°Ρ€ΡŒΠ΅Ρ€Π°. */

 volatile DWORD b_threshold; /* ΠŸΠΎΡ€ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ Π±Π°Ρ€ΡŒΠ΅Ρ€. */

} THRESHOLD_BARRIER, *THB_HANDLE;


/* ΠšΠΎΠ΄Ρ‹ ошибок. */

#define SYNCH_OBJ_NOMEM 1 /* НСвозмоТно Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ рСсурсы. */

#define SYNCH_OBJ_BUSY 2 /* ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚. */

#define SYNCH_OBJ_INVALID 3 /* ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ являСтся Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. */

DWORD CreateThresholdBarrier(THB_HANDLE *, DWORD /* ΠŸΠΎΡ€ΠΎΠ³. */);

DWORD WaitThresholdBarrier(THB_HANDLE);

DWORD CloseThresholdBarrier(THB_HANDLE); 

Рассмотрим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 10.2 Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ‚Ρ€Π΅Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. На Web-сайтС ΠΊΠ½ΠΈΠ³ΠΈ находится тСстовая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° testTHB. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ Π²Π°ΠΌ Ρ†ΠΈΠΊΠ» ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ условия Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ оТидания WaitThresholdBarrier. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, эта функция Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ наступлСния события, Π½ΠΎ ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ события Π² сигнальноС состояниС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PulseEvent. ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ обсуТдСниС ΠΌΠΎΠ΄Π΅Π»ΠΈ "ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ/ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ" ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΎ использованиС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

НаконСц, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ условия ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ послСдСйствиСм. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ условиС Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΎΡΡŒ, ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΈ Π² дальнСйшСм, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° события Π² сигнальноС состояниС Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 10.2. ThbObject.с: рСализация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€Π° 

/* Π“Π»Π°Π²Π° 10. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 10.2. */

/* Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° слоТных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² синхронизации Π½Π° основС ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°.*/

#include "EvryThng.h"

#include "synchobj.h" 

/**********************************/

/*   ΠžΠ‘ΠͺΠ•ΠšΠ’Π« ΠŸΠžΠ ΠžΠ“ΠžΠ’ΠžΠ“Πž БАРЬЕРА   */

/**********************************/

DWORD CreateThresholdBarrier(THB_HANDLE *pthb, DWORD b_value) {

 THB_HANDLE hthb;

 /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π°Ρ€ΡŒΠ΅Ρ€Π°. Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ ошибок находится Π½Π° Web-сайтС. */

 hthb = malloc(sizeof(THRESHOLD_BARRIER));

 hthb->b_guard = CreateMutex(NULL, FALSE, NULL);

 hthb->b_broadcast = CreateEvent(NULL, FALSE /* АвтоматичСски сбрасываСмоС событиС. */, FALSE, NULL);

 hthb->b_threshold = b_value;

 hthb->b_count = 0;

 hthb->b_destroyed = 0;

 *pthb = hthb;

 return 0;

}


DWORD WaitThresholdBarrier(THB_HANDLE thb) {

 /* ΠžΠΆΠΈΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ достигнСт ΠΏΠΎΡ€ΠΎΠ³Π°, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ событиС. */

 if (thb->b_destroyed == 1) return SYNCH_OBJ_INVALID;

 WaitForSingleObject(thb->b_guard, INFINITE);

 thb->b_count++; /* Появился Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. */

 while (thb->b_count < thb->b_threshold) {

  SignalObjectAndWait(thb->b_guard, thb->b_broadcast, INFINITE, FALSE);

  WaitForSingleObject(thb->b_guard, INFINITE);

 }

 PulseEvent(thb->b_broadcast) ;

 /* Π¨ΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ модСль CV, освобоТдСниС всСх ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². */

 ReleaseMutex(thb->b_guard);

 return 0;

}


DWORD CloseThresholdBarrier(THB_HANDLE thb) {

 /* Π£Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈ событиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π°Ρ€ΡŒΠ΅Ρ€Π°. */

 /* Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² отсутствии ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. */

 if (thb->b_destroyed == 1) return SYNCH_OBJ_INVALID;

 WaitForSingleObject(thb->b_guard, INFINITE);

 if (thb->b_count < thb->b_threshold) {

  ReleaseMutex(thb->b_guard);

  return SYNCH_OBJ_BUSY;

 }

 ReleaseMutex(thb->b_guard);

 CloseHandle(thb->b_guard);

 CloseHandle(thb->b_broadcast);

 free(thb);

 return 0;

}

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°

ВозмоТности Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€Π° Π² интСрСсах простоты Π±Ρ‹Π»ΠΈ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹. Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Windows ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

β€’ Π Π°Π·Ρ€Π΅ΡˆΠΈΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ (Π³Π»Π°Π²Π° 15).

β€’ Π Π°Π·Ρ€Π΅ΡˆΠΈΠ² присвоСниС ΠΈΠΌΠ΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ.

β€’ Π”опуская Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… "дСскрипторов" ΠΈ Π½Π΅ уничтоТая ΠΈΡ… Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° счСтчик ссылок Π½Π΅ станСт Ρ€Π°Π²Π½Ρ‹ΠΌ 0.

β€’ Π Π°Π·Ρ€Π΅ΡˆΠΈΠ² совмСстноС использованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° нСсколькими процСссами.

На Web-сайтС доступна полная рСализация ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² β€” слоТного (multiple-wait) сСмафора, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ счСтчика сСмафора сразу Π½Π° нСсколько Π΅Π΄ΠΈΠ½ΠΈΡ†, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹Π΅ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², рассматриваСмых Π² Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅.