β’ ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° 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);