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

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

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

β€’ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° CRITICAL_SECTION вмСсто ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Однако Π² этом случаС вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SignalObjectAndWait слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ EnterCriticalSection с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ события. Π­Ρ‚ΠΎΡ‚ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ двумя Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ β€” QueueObjCS.с ΠΈ QueueObjCS_Sig.с, находящимися Π½Π° Web-сайтС ΠΊΠ½ΠΈΠ³ΠΈ.

β€’ ΠΠ° Web-сайтС находятся Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΉΠ»Π° с исходными ΠΊΠΎΠ΄Π°ΠΌΠΈ β€” QueueObj_noSOAW.с ΠΈ QueueObjSig_noSOAW.с, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… функция SignalObjectAndWait Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Windows 9x.

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

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: использованиС ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ Π² многоступСнчатом ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π΅

МодСль "хозяин/Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ", Π²ΠΎ всСх Π΅Π΅ вариациях, являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярных ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ программирования, Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 8.2 прСдставляСт ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ модСль "ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ/ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ", ΡΠ²Π»ΡΡŽΡ‰ΡƒΡŽΡΡ частным случаСм Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅ΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ (pipeline model).

Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π²Π°ΠΆΠ½ΠΎΠΌ частном случаС имССтся ΠΎΠ΄ΠΈΠ½ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ задания (work units) для ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ количСства Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΈΡ… Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. Вакая ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΏΡ€ΠΈ создании ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сСрвСра с большим количСством ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² (число ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΡΡ‚ΠΈΠ³Π°Ρ‚ΡŒ тысячи ΠΈ Π±ΠΎΠ»Π΅Π΅), ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ выдСлСния нСзависимого Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° вСсьма ΡΠΎΠΌΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°. Π’ Π³Π»Π°Π²Π΅ 14 Π·Π°Π΄Π°Ρ‡Π° создания ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ сСрвСра обсуТдаСтся Π² контСкстС ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°.

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

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 10.5 (ThreeStage.c) прСдусмотрСно созданиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… этапов производства ΠΈ потрСблСния, Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… поддСрТиваСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… Π·Π°Π΄Π°Π½ΠΈΠΉ, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. КаТдая ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ. ВсСго сущСствуСт Ρ‚Ρ€ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π½Ρ‹Ρ… ступСни, ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰ΠΈΡ… Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ этапа ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ структуру:

β€’ ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ (producers) пСриодичСски ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Π΅ сообщСния, Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ суммами, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ для этого Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎ ΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 8.2, Ссли Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ сообщСнии содСрТится Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ адрСсата, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΠΏΠΎΡ‚ΠΎΠΊ потрСбитСля (consumer), для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ это сообщСниС, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ связываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΏΠ°Ρ€ "ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ/ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ" задаСтся Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ посылаСт ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ΅ сообщСниС ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ (transmitter), помСщая Π΅Π³ΠΎ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСний. Если ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΆΠ΄Π΅Ρ‚, ΠΏΠΎΠΊΠ° Π΅Π΅ состояниС Π½Π΅ измСнится.

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

β€’ ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Π΅ сообщСния, входящиС Π² состав ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ сообщСния, ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ… Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ потрСбитСля, Ссли ΠΎΠ½Π° Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π°.

β€’ ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ потрСбитСля ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ сообщСния ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΠΈΡ… поступлСния ΠΈ записываСт сообщСниС Π² Ρ„Π°ΠΉΠ» ΠΆΡƒΡ€Π½Π°Π»Π° рСгистрации.

Π‘Π»ΠΎΠΊ-схСма систСмы прСдставлСна Π½Π° рис. 10.1. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ эта систСма ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΠ΅Ρ‚ сСтСвоС соСдинСниС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сообщСния, относящиСся ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌ "ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒ/ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ" ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ связи. 

Рис. 10.1. ΠœΠ½ΠΎΠ³ΠΎΡΡ‚ΡƒΠΏΠ΅Π½Ρ‡Π°Ρ‚Ρ‹ΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 10.5 ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ 10.4. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ отобраТСния сообщСний здСсь Π½Π΅ прСдставлСны, Π½ΠΎ ΠΎΠ½ΠΈ взяты ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ 8.1. ΠŸΡ€ΠΈ этом, наряду с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ суммами ΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π² Π±Π»ΠΎΠΊΠΈ сообщСний Π²Π²Π΅Π΄Π΅Π½Ρ‹ поля производитСля ΠΈ адрСсата.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 10.5. ThreeStage.с: многоступСнчатыйконвСйСр 

/* Π“Π»Π°Π²Π° 10. ThreeStage.с */

/* ВрСхступСнчатая систСма ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ/ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ. */

/* ИспользованиС: ThreeStage npc goal. */

/* Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ "npc" ΠΏΠ°Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² производитСля ΠΈ потрСбитСля. */

/* ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ±Ρ‰Π΅ΠΉ слоТности */

/* "goal" сообщСний, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… снабТаСтся ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ */

/* потрСбитСля, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ. */

/* БообщСния ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ "ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ", ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ */

/* ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΡƒ сообщСний "ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ", выполняСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ*/

/* Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ. НаконСц, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ отправляСт сообщСния ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ потрСбитСля. */


#include "EvryThng.h"

#include "SynchObj.h"

#include "messages.h"

#include <time.h>


#define DELAY_COUNT 1000

#define MAX_THREADS 1024


/* Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΈ коэффициСнты блокирования ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ. Π­Ρ‚ΠΈ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ */

/* ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ для обСспСчСния ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ */

/* ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’Π΅ΠΊΡƒΡ‰ΠΈΠ΅ значСния Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ сбалансированными. */

#define TBLOCK_SIZE 5 /*ΠŸΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈΠ· 5 сообщСний.*/

#define TBLOCK_TIMEOUT 50 /*Π˜Π½Ρ‚Π΅Ρ€Π²Π°Π» оТидания сообщСний ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.*/

#define P2T_QLEN 10 /* Π Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ "ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ/ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ". */

#define T2R_QLEN 4 /*Π Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ "ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ/ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ".*/

#define R2C_QLEN 4 /* Π Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ "ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ/ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ" -- */

/* для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ потрСбитСля сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.*/


DWORD WINAPI producer(PVOID);

DWORD WINAPI consumer(PVOID);

DWORD WINAPI transmitter(PVOID);

DWORD WINAPI receiver(PVOID);


typedef struct _THARG {

 volatile DWORD thread_number;

 volatile DWORD work_goal; /* Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ. */

 volatile DWORD work_done; /* Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΉ. */ '

 char future[8]; 

} THARG;


/* Π‘Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ сообщСния, посылаСмыС ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŽ.*/

typedef struct t2r_msg_tag {

 volatile DWORD num_msgs; /* ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ содСрТащихся сообщСний. */

 msg_block_t messages[TBLOCK_SIZE];

} t2r_msg_t;


queue_t p2tq, t2rq, *r2cq_array;


static volatile DWORD ShutDown = 0;

static DWORD EventTimeout = 50;


DWORD _tmain(DWORD argc, LPTSTR * argv[]) {

 DWORD tstatus, nthread, ithread, goal, thid;

 HANDLE *producer_th, *consumer_th, transmitter_th, receiver_th;

 THARG *producer_arg, *consumer_arg;

 nthread = atoi(argv[1]);

 goal = atoi(argv[2]);

 producer_th = malloc(nthread * sizeof(HANDLE));

 producer_arg = calloc(nthread, sizeof(THARG));

 consumer_th = malloc(nthread * sizeof(HANDLE));

 consumer_arg = calloc(nthread, sizeof(THARG));

 q_initialize(&p2tq, sizeof(msg_block_t), P2T_QLEN); 

 q_initialize(&t2rq, sizeof(t2r_msg_t), T2R_QLEN);

 /* Π Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ рСсурсы, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ "ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ/ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ" для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ потрСбитСля. */

 r2cq_array = calloc(nthread, sizeof(queue_t));

 for (ithread = 0; ithread < nthread; ithread++) {

  /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ r2с для ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½ΠΎΠ³ΠΎ потрСбитСля. */

  q_initialize(&r2cq_array[ithread], sizeof(msg_block_t), R2C_QLEN);

  /* Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠ°. */

  consumer_arg[ithread].thread_number = ithread;

  consumer_arg[ithread].work_goal = goal;

  consumer_arg[ithread].work_done = 0;

  consumer_th[ithread] = (HANDLE)_beginthreadex(NULL, 0, consumer, (PVOID)&consumer_arg[ithread], 0, &thid);