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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 110

Автор Π”ΠΆΡƒΠ»ΠΈΠ°Π½ Π‘Π°ΠΊΠ½Π΅Π»Π»

ΠœΠ΅Ρ‚ΠΎΠ΄ StopReading Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, выполняСтся Π»ΠΈ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ послСдний ΠΏΠΎΡ‚ΠΎΠΊ считывания. Если это Ρ‚Π°ΠΊ, ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ свободу дСйствий ΠΏΠΎΡ‚ΠΎΠΊΡƒ записи, пСрСдавая Π΅ΠΌΡƒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ ΠΈΠΌ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Если ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ записи отсутствуСт, ΠΌΠΎΠ³ΡƒΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ считывания. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Ρ‚Π°ΠΊΠΎΠΌ состоянии, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊ считывания ΠΈΠ»ΠΈ записи ΠΌΠΎΠ³ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠœΠ΅Ρ‚ΠΎΠ΄ StartWriting Ρ‚Π°ΠΊΠΆΠ΅ выполняСт нСсколько Π·Π°Π΄Π°Ρ‡. Если ΠΏΠΎΡ‚ΠΎΠΊ записи Π°ΠΊΡ‚ΠΈΠ²Π΅Π½, ΠΎΠ½ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ поступлСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° синхронизации, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для прСдоставлСния свободы дСйствий ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ записи. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² считывания, ΠΌΠ΅Ρ‚ΠΎΠ΄ дСйствуСт Ρ‚Π°ΠΊ ΠΆΠ΅. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ рСгистрируСтся ΠΊΠ°ΠΊ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΈ выполняСт Π²Ρ‹Ρ…ΠΎΠ΄, позволяя ΠΏΠΎΡ‚ΠΎΠΊΡƒ записи ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

ΠœΠ΅Ρ‚ΠΎΠ΄ StopWriting отмСняСт Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π³ΠΎΡΡ Π² качСствС Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ, Π° Π·Π°Ρ‚Π΅ΠΌ провСряСт сущСствованиС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΊ запуску ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² считывания. Если Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΠΌ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ ΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Если ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ считывания ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚, ΠΌΠ΅Ρ‚ΠΎΠ΄ провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° записи. Если Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚, ΠΌΠ΅Ρ‚ΠΎΠ΄ прСдоставляСт ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· Π½ΠΈΡ… свободу дСйствий, пСрСдавая Π΅ΠΌΡƒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ всСми этими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Если Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· пСрСчислСнных ситуаций Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ мСста, ΠΌΠ΅Ρ‚ΠΎΠ΄ оставляСт составной ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² состоянии, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΌ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ запуск ΠΏΠΎΡ‚ΠΎΠΊΠ° чтСния ΠΈΠ»ΠΈ записи.

Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ описания, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ряд Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ². Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π½Π°ΠΌ трСбуСтся пСрСмСнная для хранСния числа ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² считывания. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, трСбуСтся пСрСмСнная для хранСния числа ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² записи. Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° пСрСмСнная для хранСния числа Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² считывания. Π’-Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹Ρ…, Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π±ΡƒΠ»Π΅Π² Ρ„Π»Π°Π³, ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° записи. И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π½Π°ΠΌ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ синхронизации, содСрТащиС всС пСрСчислСнныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹.

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

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

А ΠΊΠ°ΠΊΠΈΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² считывания? Π‘ΠΎΠ»ΡŒΡˆΠ΅ всСго подошли Π±Ρ‹ сСмафор ΠΈΠ»ΠΈ событиС сброса Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ случаС, Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСмафор, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° события ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ возникновСнию ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ (ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ Π΅Π³ΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° ΠΏΠΎΡ‚ΠΎΠΊΠΈ;

Π² Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² состоянии, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ Π²Ρ‹Π·Π²Π°Π» ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ WaitFor).

Код интСрфСйса создаваСмого Π½Π°ΠΌΠΈ класса синхронизации TtdReadWriteSync ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 12.1. Он содСрТит ряд ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… основных ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ….

Листинг 12.1. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ класса TtdReadWriteSync


type

TtdReadWriteSync = class private

FActiveReaders : integer;

FActiveWriter : boolean;

FBlockedReaders : THandle;

{сСмафор}

FBlockedWriters : THandle;

{сСмафор}

FController : TRTLCriticalSection;

FWaitingReaders : integer;

FWaitingWriters : integer;

protected

public


constructor Create;

destructor Destroy; override;

procedure StartReading;

procedure StartWriting;

procedure StopReading;

procedure StopWriting;

end;


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

Код ΠΌΠ΅Ρ‚ΠΎΠ΄Π° StartReading ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 12.2.

Листинг 12.2. ΠœΠ΅Ρ‚ΠΎΠ΄ StartReading


procedure TtdReadWriteSync.StartReading;

var

HaveToWait : boolean;

begin

{ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ критичСским Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ}

EnterCriticalSection(FController);

{Ссли сущСствуСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΏΠΎΡ‚ΠΎΠΊ записи ΠΈΠ»ΠΈ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ своСй ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ записи, ΠΌΠ΅Ρ‚ΠΎΠ΄ добавляСт сСбя Π² качСствС ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° записи, обСспСчивая ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² состояниС оТидания}

if FActiveWriter or (FWaitingWriters <> 0) then begin

inc(FWaitingReaders);

HaveToWait :=true;

end

{Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ добавляСт сСбя Π² качСствС Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠ° считывания ΠΈ обСспСчиваСт отсутствиС состояния оТидания}

else begin

inc(FActiveReaders);

HaveToWait := false;

end;

{ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ критичСским Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ}

LeaveCriticalSection(FController);

{ΠΏΡ€ΠΈ нСобходимости оТидания Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅}

if HaveToWait then

WaitForSingleObject(FBlockedReaders, INFINITE);

end;


ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ критичСским Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ. ПослС этого ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ значСниями Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π³ΠΎΡΡ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ»ΠΈ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° записи ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ число ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² считывания, освобоТдаСт ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ критичСским Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состояниС оТидания сСмафора "Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ считывания". ΠŸΡ€ΠΈ отсутствии ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² записи ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ число Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² считывания ΠΈ освобоТдаСт критичСский Ρ€Π°Π·Π΄Π΅Π». По Π²Ρ‹Ρ…ΠΎΠ΄Ρƒ ΠΈΠ· этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π»ΠΈΠ±ΠΎ освобоТдаСтся ΠΎΡ‚ нСобходимости ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄Π° сСмафора, Π»ΠΈΠ±ΠΎ сразу пропускаСт состояниС оТидания. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ» число Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² считывания, Π° Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π½Π΅Ρ‚. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ ошибкой, Π½ΠΎ вскорС ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

Рассмотрим ΠΌΠ΅Ρ‚ΠΎΠ΄ StopReading, ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 12.3.

Листинг 12.3. ΠœΠ΅Ρ‚ΠΎΠ΄ StopReading


procedure TtdReadWriteSync.StopReading;

begin

{ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ критичСским Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ}

EnterCriticalSection(FController);

{считываниС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ}

dec (FActiveReaders);

{Ссли выполняСтся послСдний ΠΏΠΎΡ‚ΠΎΠΊ считывания ΠΈ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° записи Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ свободу дСйствий}

if (FActiveReaders = 0) and (FWaitingWriters <> 0) then begin

dec(FWaitingWriters);

FActiveWriter :=true;

ReleaseSemaphore(FBlockedWriters, 1, nil);

end;

{ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ критичСским Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ}

LeaveCriticalSection(FController);

end;


Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ критичСским Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ стрСмится ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ свои дСйствия ΠΏΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΡŽ, поэтому ΠΎΠ½ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² считывания. Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ, это ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² считывания. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ просто освобоТдаСт ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ критичСским Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ ΠΈ осущСствляСт Π²Ρ‹Ρ…ΠΎΠ΄. Однако Ссли этот ΠΏΠΎΡ‚ΠΎΠΊ Π±Ρ‹Π» послСдним Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ считывания, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ свободу дСйствий ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ записи (Ссли Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ сущСствуСт). Для этого ΠΌΠ΅Ρ‚ΠΎΠ΄ освобоТдаСт сСмафор Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² записи. Π˜Π½Π°Ρ‡Π΅ говоря, ΠΌΠ΅Ρ‚ΠΎΠ΄ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ систСма прСдоставит свободу дСйствий ΠΎΠ΄Π½ΠΎΠΌΡƒ, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ записи, послС Ρ‡Π΅Π³ΠΎ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ снова ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Π΄ΠΎ нуля, обСспСчивая Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² записи. Однако нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ StopReading ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² записи ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² записи. ΠžΠ±Ρ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния этого ΠΊΠΎΠ΄Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ записи освобоТдаСтся, Π° значСния Π΄Π²ΡƒΡ… счСтчиков ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² записи ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ.