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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ПолноС руководство. Π‘# 4.0Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 180

Автор Π¨ΠΈΠ»Π΄Ρ‚ Π“Π΅Ρ€Π±Π΅Ρ€Ρ‚

Π Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ Π΄Π²Π΅ разновидности многозадачности: Π½Π° основС процСссов ΠΈ Π½Π° основСпотоков. Π’ связи с этим Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ отличия ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. ΠŸΡ€ΠΎΡ†Π΅ΡΡ фактичСскипрСдставляСт собой ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π½Π° основС процСссов β€” это срСдство, благодаря ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄Π²Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π±ΠΎΠ»Π΅Π΅. Π’Π°ΠΊ, ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π½Π° основС процСссов позволяСтодноврСмСнно Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ тСкстового Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°, элСктронных Ρ‚Π°Π±Π»ΠΈΡ† ипросмотра содСрТимого Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅. ΠŸΡ€ΠΈ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ многозадачности Π½Π° основСпроцСссов ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° являСтся наимСньшСй Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ ΠΊΠΎΠ΄Π°, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ Π·Π°Π΄Π°Ρ‡.ΠŸΠΎΡ‚ΠΎΠΊ прСдставляСт собой ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ исполняСмого ΠΊΠΎΠ΄Π°. БвоимпроисхоТдСниСм этот Ρ‚Π΅Ρ€ΠΌΠΈΠ½ обязан ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ "ΠΏΠΎΡ‚ΠΎΠΊ исполнСния". ΠŸΡ€ΠΈ организациимногозадачности Π½Π° основС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ процСсса Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ, хотя ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ большС. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒΡΡ Π΄Π²Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ большС. НапримСр, тСкст ΠΌΠΎΠΆΠ΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ тСкста ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с Π΅Π³ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ, ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ обаэти дСйствия Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² Π΄Π²ΡƒΡ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ….ΠžΡ‚Π»ΠΈΡ‡ΠΈΡ Π² многозадачности Π½Π° основС процСссов ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ свСдСны ΠΊΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ: ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π½Π° основС процСссов организуСтся для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎΠ²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π° ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π½Π° основС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² β€” для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… частСй ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.Π“Π»Π°Π²Π½ΠΎΠ΅ прСимущСство ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° позволяСт ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ эффСктивно благодаря возмоТности Π²Ρ‹Π³ΠΎΠ΄Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ врСмя простоя, Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π΅Π΅ Π² Ρ…ΠΎΠ΄Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡΠ±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Как извСстно, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ устройств Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Π±ΡƒΠ΄ΡŒ тоустройства, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΊ сСтСвым ΠΏΠΎΡ€Ρ‚Π°ΠΌ, Π½Π°ΠΊΠΎΠΏΠΈΡ‚Π΅Π»ΠΈ Π½Π° дисках ΠΈΠ»ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°,Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ процСссор (ЦП). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽΡ‡Π°ΡΡ‚ΡŒ своСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ приходится ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° устройствоввода-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· Π½Π΅Π³ΠΎ. А благодаря ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ Π²ΠΎ врСмя Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ простоя. НапримСр, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΎΠ΄Π½Π° Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ отправляСт Ρ„Π°ΠΉΠ» чСрСзсоСдинСниС с Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ΠΎΠΌ, другая Π΅Π΅ Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ тСкстовой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π²Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΡ β€” ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎΠ±Π»ΠΎΠΊΠ° отправляСмых Π΄Π°Π½Π½Ρ‹Ρ….ΠŸΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… состояний. Π’ Ρ†Π΅Π»ΠΎΠΌ, ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΌΡΡ; Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ врСмя ΠΈ Ρ€Π΅ΡΡƒΡ€ΡΡ‹Π¦ΠŸ; приостановлСнным, Ρ‚:Π΅. Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΌΡΡ; Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌ Π² дальнСйшСм; Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ рСсурсов для своСго выполнСния; Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹ΠΌ, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΊΠΎΠ½Ρ‡Π΅Π½ΠΎ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΎ.Π’ срСдС .NET Framework ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π΄Π²Π΅ разновидности ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²: ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉΠΈ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ создаваСмый ΠΏΠΎΡ‚ΠΎΠΊ автоматичСски становится ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΌ, Π½ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΌ. ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΡ‚Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Ρ… Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ автоматичСски Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Ссли Π² СгопроцСссС остановлСны всС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ.Π’ связи с ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ многозадачности Π½Π° основС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒΠ² особого Ρ€ΠΎΠ΄Π° Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся синхронизациСй ΠΈ позволяСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Для Ρ‚Π°ΠΊΠΎΠΉ синхронизациив C# прСдусмотрСна ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ подсистСма, основныС срСдства ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² этой Π³Π»Π°Π²Π΅.ВсС процСссы состоят хотя Π±Ρ‹ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ основным, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ с Π½Π΅Π³ΠΎ начинаСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ,Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ всС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Из основного ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ.Π’ языкС C# ΠΈ срСдС .NET Framework ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΎΠ±Π΅ разновидности многозадачности: Π½Π° основС процСссов ΠΈ Π½Π° основС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ срСдствами C# ΠΌΠΎΠΆΠ½ΠΎΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ процСссы, Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈ Ρ‚Π΅ΠΌΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ. Длятого Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ процСсс, ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ трСбуСтся совсСм Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ усилий, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ процСсс ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ обособлСн ΠΎΡ‚ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ. Намного Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎΠΉ оказываСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π² C# ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, благодаря ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ упрощаСтся написаниС Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…,ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° C# ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ языками программирования.ΠšΠ»Π°ΡΡΡ‹, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² пространствС ΠΈΠΌΠ΅Π½ System.Threading. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ любая многопоточная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° C#Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку ΠΊΠΎΠ΄Π°.using System.Threading;Класс ThreadБистСма ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ основываСтся Π½Π° классС Thread, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инкапсулируСт ΠΏΠΎΡ‚ΠΎΠΊ исполнСния. Класс Thread являСтся Π³Π΅Ρ€ΠΌΠ΅Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌ, Ρ‚.Π΅. ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π’ классС Thread ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ряд ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ свойств, прСдназначСнныхдля управлСния ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. На протяТСнии всСй этой Π³Π»Π°Π²Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ‡Π»Π΅Π½Ρ‹ Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса.Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ запуск потокаДля создания ΠΏΠΎΡ‚ΠΎΠΊΠ° достаточно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° Thread,Ρ‚.Π΅. класса, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² пространствС ΠΈΠΌΠ΅Π½ System.Threading. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π°ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ°Ρ Ρ„ΠΎΡ€ΠΌΠ° конструктора класса Thread:public Thread(ThreadStart запуск)Π³Π΄Π΅ запуск β€” это имя ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ с Ρ†Π΅Π»ΡŒΡŽ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°,a ThreadStart β€” Π΄Π΅Π»Π΅Π³Π°Ρ‚, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² срСдС .NET Framework, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎΠ½ΠΈΠΆΠ΅.public delegate void ThreadStart()Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠ΅Ρ‚ΠΎΠ΄, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Π² качСствС Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒΠ²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ void ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².Π’Π½ΠΎΠ²ΡŒ созданный Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π½Π°Ρ‡Π½Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚Π²Ρ‹Π·Π²Π°Π½ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Start(), опрСдСляСмый Π² классС Thread. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Start(). НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ….public void Start()ΠžΠ΄Π½Π°ΠΆΠ΄Ρ‹ Π½Π°Ρ‡Π°Π²ΡˆΠΈΡΡŒ, ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ запуск. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° изэтого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠΎΡ‚ΠΎΠΊ автоматичСски прСкращаСтся. Если ΠΆΠ΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Start() для ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ начался, это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ThreadStateException.Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ создаСтся ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ исполнСния.using System;using System.Threading;class MyThread {public int Count;string thrdName;public MyThread(string name) {Count = 0;thrdName = name;}// Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ.public void Run() {Console.WriteLine(thrdName + " Π½Π°Ρ‡Π°Ρ‚.");do {Thread.Sleep(500);Console.WriteLine("Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ " + thrdName + ", Count = " + Count);Count++;} while(Count < 10);Console.WriteLine(thrdName + " Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}class MultiThread {static void Main() {Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚.");// Π‘Π½Π°Ρ‡Π°Π»Π° ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° MyThread.MyThread mt = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1");// Π”Π°Π»Π΅Π΅ ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.Thread newThrd = new Thread(mt.Run);// И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π½Π°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°.newThrd.Start();do {Console.Write(".");Thread.Sleep(100);} while (mt.Count != 10);Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}Рассмотрим ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. Π’ самом Π΅Π΅ началСопрСдСляСтся класс MyThread, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для создания Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° исполнСния. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Run() этого класса организуСтся Ρ†ΠΈΠΊΠ» для подсчСта ΠΎΡ‚ 0 Π΄ΠΎ 9. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π²Ρ‹Π·ΠΎΠ² статичСского ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Sleep(), ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² классС Thread.Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ обусловливаСт приостановлСниС Ρ‚ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½,Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Π² миллисСкундах. Когда приостанавливаСтся ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Sleep():public static void Sleep(int миллисСкундпростоя)Π³Π΄Π΅ миллисСкундпростоя ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ приостанавливаСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Если ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ количСство миллисСкундпростоя Ρ€Π°Π²Π½ΠΎΠ½ΡƒΠ»ΡŽ, Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ приостанавливаСтся лишь для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒΠ²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ для выполнСния ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅Π³ΠΎ своСй ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Main() Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° Thread создаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉΠ½ΠΈΠΆΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ².// Π‘Π½Π°Ρ‡Π°Π»Π° ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° MyThread.MyThread mt = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1");// Π”Π°Π»Π΅Π΅ ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.Thread newThrd = new Thread(mt.Run);// И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π½Π°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°.newThrd.Start();Как слСдуСт ΠΈΠ· ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΊ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ Π²Ρ‹ΡˆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρƒ ΠΊΠΎΠ΄Π°, сначала создаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° MyThread. Π—Π°Ρ‚Π΅ΠΌ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ‚ΠΈΠΏΠ° Thread, для Ρ‡Π΅Π³ΠΎ конструктору этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² качСствС Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° пСрСдаСтсямСтод mt.Run(). И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° начинаСтся с Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Start().Благодаря этому ΠΌΠ΅Ρ‚ΠΎΠ΄ mt.Run() выполняСтся Π² своСм собствСнном ΠΏΠΎΡ‚ΠΎΠΊΠ΅. ПослС Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Start() Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ основного ΠΏΠΎΡ‚ΠΎΠΊΠ° возвращаСтся ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Main(),Π³Π΄Π΅ начинаСтся Ρ†ΠΈΠΊΠ» do-while. Оба ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ЦП, Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ окончания Ρ†ΠΈΠΊΠ»Π°. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. (Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ срСды выполнСния, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ стСпСни Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π·Π°Π΄Π°Ρ‡.)Основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚.ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π½Π°Ρ‡Π°Ρ‚.....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 0....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 1....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 2....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 3....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 4....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 5....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 6....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 7....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 8....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 9ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ основной ΠΏΠΎΡ‚ΠΎΠΊ Π±Ρ‹Π» послСдним ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌ Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ всС Π΅Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, совсСм Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ этого ΠΏΡ€Π°Π²ΠΈΠ»Π° принято ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΎ явно опрСдСляСт ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.Π’ рассмотрСнной Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ прСдпринята ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ основной ΠΏΠΎΡ‚ΠΎΠΊΠ·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌ Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Для этой Ρ†Π΅Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Count провСряСтся Π² Ρ†ΠΈΠΊΠ»Π΅ do-while Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Main(), ΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ оказываСтсяравным 10, Ρ†ΠΈΠΊΠ» Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈ происходит ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Sleep().Но Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΄Π°Π»Π΅ΠΊ ΠΎΡ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²Π°, поэтому Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅ Π±ΡƒΠ΄ΡƒΡ‚ прСдставлСны Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹Π΅ способы ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ оТидания ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡΠ΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ.ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ способы ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ программыРассмотрСнная Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²ΠΏΠΎΠ»Π½Π΅ работоспособна, Π½ΠΎ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивной, внСся ряд простых ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΠΉ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒΡ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΎΡΡŒ сразу ΠΆΠ΅ послС Π΅Π³ΠΎ создания. Для этого достаточно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° Thread Π² конструкторС класса MyThread.И Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π² классС MyThread совсСм Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ имя ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒΠ΄Π»Ρ этой Ρ†Π΅Π»ΠΈ Π² классС Thread ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ свойство Name.public string Name { get; set; }Бвойство Name доступно для записи ΠΈ чтСния ΠΈ поэтому ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ длязапоминания, Ρ‚Π°ΠΊ ΠΈ для считывания ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°.НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° вСрсия ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ внСсСны ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Π΅Π²Ρ‹ΡˆΠ΅ ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡ.// Π”Ρ€ΡƒΠ³ΠΎΠΉ способ запуска ΠΏΠΎΡ‚ΠΎΠΊΠ°.using System;using System.Threading;class MyThread {public int Count;public Thread Thrd;public MyThread(string name) {Count = 0;Thrd = new Thread(this.Run);Thrd.Name = name; // Π·Π°Π΄Π°Ρ‚ΡŒ имя ΠΏΠΎΡ‚ΠΎΠΊΠ°Thrd.Start(); // Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ}// Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ.void Run() {Console.WriteLine(Thrd.Name + " Π½Π°Ρ‡Π°Ρ‚.");do {Thread.Sleep(500);Console.WriteLine("Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ " + Thrd.Name + ", Count = " + Count);Count++;} while(Count < 10);Console.WriteLine(Thrd.Name + " Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}class MultiThreadImproved {static void Main() {Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚.");// Π‘Π½Π°Ρ‡Π°Π»Π° ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° MyThread.MyThread mt = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1");do {Console.Write(".");Thread.Sleep(100);} while (mt.Count != 10);Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}Π­Ρ‚Π° вСрсия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠ°ΠΊ ΠΈ прСдыдущая. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° сохраняСтся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Thrd ΠΈΠ· класса MyThread.Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π±Ρ‹Π» создан лишь ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.Но Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², сколько потрСбуСтся. НапримСр,Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°.// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² исполнСния.using System;using System.Threading;class MyThread {public int Count;public Thread Thrd;public MyThread(string name) {Count = 0;Thrd = new Thread(this.Run);Thrd.Name = name;Thrd.Start();}// Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ.void Run() {Console.WriteLine(Thrd.Name + " Π½Π°Ρ‡Π°Ρ‚.");do {Thread.Sleep(500);Console.WriteLine("Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ " + Thrd.Name + ", Count = " + Count);Count++;} while(Count < 10);Console.WriteLine(Thrd.Name + " Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}class MoreThreads {static void Main() {Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚.");// Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°.MyThread mt1 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1");MyThread mt2 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2") ;MyThread mt3 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3");do {Console.Write(".");Thread.Sleep(100);} while(mt1.Count < 10 ||mt2.Count < 10 ||mt3.Count < 10);Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² выполнСния этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ΠžΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚..ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π½Π°Ρ‡Π°Ρ‚.ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π½Π°Ρ‡Π°Ρ‚.ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3 Π½Π°Ρ‡Π°Ρ‚.....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 0Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 0Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 0.....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 1Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 1Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 1.....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 2Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 2Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 2.....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 3Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 3Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 3.....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 4Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 4Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 4.....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 5Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 5Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 5.....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 6Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 6Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 6.....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 7Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 7Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 7.....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 8Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 8Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 8.....Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 9ΠŸΠΎΡ‚ΠΎΠΊ #1 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 9ΠŸΠΎΡ‚ΠΎΠΊ #2 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 9ΠŸΠΎΡ‚ΠΎΠΊ #3 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ всС Ρ‚Ρ€ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π°Ρ‡Π½ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚Π½ΠΎΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ЦП. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости отсрСды выполнСния, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π½Π΅ΡˆΠ½ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ², Π²Π»ΠΈΡΡŽΡ‰ΠΈΡ… Π½Π°Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончания потокаНСрСдко оказываСтся ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊ. Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ для этой Ρ†Π΅Π»ΠΈ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π»ΠΎΡΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Count.Но вСдь это Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ Π»ΡƒΡ‡ΡˆΠ΅Π΅ ΠΈ Π½Π΅ совсСм ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΠ΅ для обобщСния Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. ΠŸΡ€Π°Π²Π΄Π°,Π² классС Thread ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… срСдства для опрСдСлСния ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончанияпотока. Π‘ этой Ρ†Π΅Π»ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ доступноС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСниясвойство IsAlive, опрСдСляСмоС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.public bool IsAlive { get; }Бвойство IsAlive Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли ΠΏΠΎΡ‚ΠΎΠΊ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ΠΎ вызываСтся, ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ выполняСтся. Для "опробования" свойства IsAliveΠΏΠΎΠ΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° вмСсто ΠΊΠΎΠ΄Π° Π² классС MoreThread ΠΈΠ·ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсии ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свойство IsAlive для отслСТивания ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончания ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².class MoreThreads {static void Main() {Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚.");// Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°.MyThread mt1 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΊ #1");MyThread mt2 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΊ #2");MyThread mt3 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΊ #3");do {Console.Write(".");Thread.Sleep(100);} while(mt1.Thrd.IsAlive &&mt2.Thrd.IsAlive &&mt3.Thrd.IsAlive);Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этой вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ получаСтся Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅. ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ свойствоIsAlive для отслСТивания ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончания ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ отслСТивания ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончания состоит Π² Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Join(). НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π΅Π³ΠΎ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ°Ρ Ρ„ΠΎΡ€ΠΌΠ°.public void Join()ΠœΠ΅Ρ‚ΠΎΠ΄ Join() ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½, Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. Π•Π³ΠΎ имя ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ оТидания Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ присоСдинится ΠΊ Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΌΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ. Если ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±Ρ‹Π» Π½Π°Ρ‡Π°Ρ‚, тогСнСрируСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ThreadStateException. Π’ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Join()ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ слСдуСт ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΠ·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ Join() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ‚ΠΎΠ³ΠΎ,Ρ‡Ρ‚ΠΎΠ±Ρ‹ основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ послСдним.// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Join().using System;using System.Threading;class MyThread {public int Count;public Thread Thrd;public MyThread(string name) {Count = 0;Thrd = new Thread(this.Run);Thrd.Name = name;Thrd.Start();}// Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ.void Run() {Console.WriteLine(Thrd.Name + " Π½Π°Ρ‡Π°Ρ‚.");do {Thread.Sleep(500);Console.WriteLine("Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ " + Thrd.Name + ", Count = " + Count);Count++;} While(Count < 10);Console.WriteLine(Thrd.Name + " Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Join() для оТидания Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€,// ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ.class JoinThreads {static void Main() {Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚.");// Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°.MyThread mt1 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1");MyThread mt2 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2");MyThread mt3 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3");mt1.Thrd.Join();Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 присоСдинСн.");mt2.Thrd.Join();Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 присоСдинСн.");mt3.Thrd.Join();Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3 присоСдинСн.");Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² выполнСния этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Напомним, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ срСды выполнСния, опСрационнойсистСмы ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ², Π²Π»ΠΈΡΡŽΡ‰ΠΈΡ… Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.Основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡Π°Ρ‚.ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π½Π°Ρ‡Π°Ρ‚.ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π½Π°Ρ‡Π°Ρ‚.ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3 Π½Π°Ρ‡Π°Ρ‚.Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 0Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 0Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 0Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 1Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 1Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 1Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 2Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 2Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 2Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 3Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 3Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 3Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 4Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 4Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 4Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 5Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 5Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 5Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 6Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 6Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 6Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 7Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 7Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 7Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 8Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 8Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 8Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 9ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 9ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3, Count = 9ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 присоСдинСн.ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 присоСдинСн.ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #3 присоСдинСн.Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎΡ€ΡΠ΄Π° Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Join().ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠΎΡ‚ΠΎΠΊΡƒΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π² срСдС .NET Framework нСльзя Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΡƒ,ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ начинался, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΡΠ»ΡƒΠΆΠΈΠ²ΡˆΠ΅Π³ΠΎ Π² качСствС Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ, Π½Π΅ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Если ΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ,Ρ‚ΠΎ ΠΊ этой Ρ†Π΅Π»ΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΈΠ΄Ρ‚ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ путями, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ. Но этот нСдостаток Π±Ρ‹Π» впослСдствии устранСн, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒΠ°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΏΠΎΡ‚ΠΎΠΊΡƒ. Для этого придСтся Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈΡ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Start(), конструктора класса Thread, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, слуТащСго вкачСствС Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ.АргумСнт пСрСдаСтся ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Start().public void Start(object ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€)ΠžΠ±ΡŠΠ΅ΠΊΡ‚, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, автоматичСски пСрСдаСтсямСтоду, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΌΡƒ Ρ€ΠΎΠ»ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, достаточно ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Start().Для примСнСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Start() потрСбуСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° конструктора класса Thread:public Thread(ParameterizedThreadStart запуск)Π³Π΄Π΅ запуск ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ с Ρ†Π΅Π»ΡŒΡŽ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² этой Ρ„ΠΎΡ€ΠΌΠ΅ конструктора запуск ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏParameterizedThreadStart, Π° Π½Π΅ ThreadStart, ΠΊΠ°ΠΊ Π² Ρ„ΠΎΡ€ΠΌΠ΅, использовавшСйсяв ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ParameterizedThreadStart являСтся Π΄Π΅Π»Π΅Π³Π°Ρ‚ΠΎΠΌ, ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅ΠΌΡ‹ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.public delegate void ParameterizedThreadStart(object obj)Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, этот Π΄Π΅Π»Π΅Π³Π°Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° object. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ примСнСния Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ конструктора класса Thread Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, слуТащСгов качСствС Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° object.Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ дСмонстрируСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΏΠΎΡ‚ΠΎΠΊΡƒ.// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°.using System;using System.Threading;class MyThread {public int Count;public Thread Thrd;// ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ конструктору класса// MyThread пСрСдаСтся Ρ‚Π°ΠΊΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° int.public MyThread(string name, int num) {Count = 0;// Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ конструктор Ρ‚ΠΈΠΏΠ° ParameterizedThreadStart// явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π΄ΠΈ наглядности ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.Thrd = new Thread(this.Run);Thrd.Name = name;// Π—Π΄Π΅ΡΡŒ пСрСмСнная num пСрСдаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Start()// Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.Thrd.Start(num);}// ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² этой Ρ„ΠΎΡ€ΠΌΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Run()// указываСтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° object.void Run(object num) {Console.WriteLine(Thrd.Name + " Π½Π°Ρ‡Π°Ρ‚ со счСта " + num);do {Thread.Sleep(500);Console.WriteLine("Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ " + Thrd.Name + ", Count = " + Count);Count++;} while(Count < (int) num);Console.WriteLine(Thrd.Name + " Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}class PassArgDemo {static void Main() {// ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ число ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ// пСрСдаСтся этим Π΄Π²ΡƒΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Ρ‚ΠΈΠΏΠ° MyThread.MyThread mt = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1", 5);MyThread mt2 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2", 3);do {Thread.Sleep(100);} while (mt.Thrd.IsAlive'| mt2.Thrd.IsAlive);Console.WriteLine("Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, хотя Ρƒ вас ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСсколько ΠΈΠ½Ρ‹ΠΌ.ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π½Π°Ρ‡Π°Ρ‚ со счСта 5ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π½Π°Ρ‡Π°Ρ‚ со счСта 3Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 0Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 0Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 1Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 1Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2, Count = 2ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 2Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 3Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1, Count = 4ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Основной ΠΏΠΎΡ‚ΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Как слСдуСт ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ повторяСтся ΠΏΡΡ‚ΡŒ Ρ€Π°Π·,Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π°. Число ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ указываСтся Π² конструкторС класса MyThreadΠΈ Π·Π°Ρ‚Π΅ΠΌ пСрСдаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Run(), слуТащСму Π² качСствС Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ ParameterizedThreadStart ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Start().Бвойство IsBackgroundКак ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, Π² срСдС .NET Framework ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π΄Π²Π΅ разновидностипотоков: ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉ ΠΈ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ. ЕдинствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡΠ² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ процСсс Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ окончится ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ,Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ автоматичСски ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ всСх ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ создаваСмый ΠΏΠΎΡ‚ΠΎΠΊ становится ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΌ. Но Π΅Π³ΠΎΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ свойство IsBackground, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π² классСThread, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.public bool IsBackground { get; set; }Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΌ, достаточно ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅true свойству IsBackground. А логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ потокявляСтся ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΌ.ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° имССтся свой ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отчасти опрСдСляСт, Π½Π°ΡΠΊΠΎΠ»ΡŒΠΊΠΎΡ‡Π°ΡΡ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ доступ ΠΊ ЦП. Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, Π½ΠΈΠ·ΠΊΠΎΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ доступ ΠΊ ЦП Ρ€Π΅ΠΆΠ΅, Ρ‡Π΅ΠΌ высокоприоритСтныС. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½ΠΈΠ·ΠΊΠΎΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π±ΡƒΠ΄Π΅Ρ‚ доступно мСньшС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈΠ¦ΠŸ, Ρ‡Π΅ΠΌ высокоприоритСтному. Как ΠΈ слСдовало ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, врСмя ЦП, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅ влияниС Π½Π° Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ Π΅Π³ΠΎ выполнСния ΠΈ взаимодСйствия с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, исполняСмыми Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² систСмС.Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ, ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°, Π½Π° частоту доступа ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊ Π¦ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ влияниС ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Π°ΠΊΡ‚ΠΎΡ€Ρ‹. Π’Π°ΠΊ, Ссли высокоприоритСтный ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ доступа ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ рСсурсу, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для Π²Π²ΠΎΠ΄Π° с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, ΠΎΠ½ блокируСтся,Π° вмСсто Π½Π΅Π³ΠΎ выполняСтся Π½ΠΈΠ·ΠΊΠΎΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Π’ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ситуации Π½ΠΈΠ·ΠΊΠΎΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ ЦП Ρ‡Π°Ρ‰Π΅, Ρ‡Π΅ΠΌ высокоприоритСтныйпоток Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ влияниС Π½Π° врСмя ЦП,выдСляСмоС для ΠΏΠΎΡ‚ΠΎΠΊΠ°.Когда ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, устанавливаСмый ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ свойстваPriority, ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ Ρ‡Π»Π΅Π½ΠΎΠΌ класса Thread. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° общая Ρ„ΠΎΡ€ΠΌΠ° Π΄Π°Π½Π½ΠΎΠ³ΠΎ свойства:public ThreadPriority Priority{ get; set; }Π³Π΄Π΅ ThreadPriority ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ пСрСчислСниС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅Π½ΠΈΠΆΠ΅ значСния ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ².ThreadPriority.HighestThreadPriority.AboveNormalThreadPriority.NormalThreadPriority.BelowNormalThreadPriority.LowestПо ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΏΠΎΡ‚ΠΎΠΊΠ° устанавливаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ThreadPriority.Normal.Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ стало понятнСС влияниС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² Π½Π° исполнСниС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², обратимся ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°: ΠΎΠ΄ΠΈΠ½ с Π±ΠΎΠ»Π΅Π΅ высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. Оба ΠΏΠΎΡ‚ΠΎΠΊΠ° ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² качСствС экзСмпляров ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса MyThread.Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Run() организуСтся Ρ†ΠΈΠΊΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ подсчитываСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ числоповторСний. Π¦ΠΈΠΊΠ» Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° подсчСт достигаСт Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ 1000000000 ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° статичСская пСрСмСнная stop ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true. ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ stop ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π³Π΄Π΅ производится подсчСт Π΄ΠΎ 1000000000, устанавливаСтся логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ stop. Π’ силу этого Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ оканчиваСтся Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ своСм ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС Ρ†ΠΈΠΊΠ»Π° строка Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ currentName провСряСтся Π½Π°Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ исполняСмого ΠΏΠΎΡ‚ΠΎΠΊΠ°. Если ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ исполняСмых Π·Π°Π΄Π°Ρ‡. Всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡, имя Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° отобраТаСтся ΠΈ присваиваСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉcurrentName. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ частоту доступа ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊ ЦП. По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² отобраТаСтся число ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ»Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ….// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ влияниС ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².using System;using System.Threading;class MyThread {public int Count;public Thread Thrd;static bool stop = false;static string currentName;/ Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎΠ΄Π°Π½Π½Ρ‹ΠΉ конструктор Π΅Ρ‰Π΅ Π½Π΅ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². /public MyThread(string name) {Count = 0;Thrd = new Thread(this.Run);Thrd.Name = name;currentName = name;}// ΠΠ°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.void Run() {Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΊ " + Thrd.Name + " Π½Π°Ρ‡Π°Ρ‚.");do {Count++;if(currentName != Thrd.Name) {currentName = Thrd.Name;Console.WriteLine("Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ " + currentName);}} while(stop == false && Count < 1000000000);stop = true;Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΊ " + Thrd.Name + " Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}class PriorityDemo {static void Main() {MyThread mt1 = new MyThread("с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ");MyThread mt2 = new MyThread("с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ");// Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².mt1.Thrd.Priority = ThreadPriority.AboveNormal;mt2.Thrd.Priority = ThreadPriority.BelowNormal;// ΠΠ°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ.mt1.Thrd.Start();mt2.Thrd.Start();mt1.Thrd.Join();mt2.Thrd.Join();Console.WriteLine();Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΊ " + mt1.Thrd.Name +" досчитал Π΄ΠΎ " + mt1.Count);Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΊ " + mt2.Thrd.Name +" досчитал Π΄ΠΎ " + mt2.Count);}}Π’ΠΎΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.ΠŸΠΎΡ‚ΠΎΠΊ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π½Π°Ρ‡Π°Ρ‚.Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌΠŸΠΎΡ‚ΠΎΠΊ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π½Π°Ρ‡Π°Ρ‚.Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌΠ’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌΠ’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌΠ’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌΠ’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌΠ’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌΠ’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌΠ’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌΠ’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌΠ’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌΠŸΠΎΡ‚ΠΎΠΊ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.ΠŸΠΎΡ‚ΠΎΠΊ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.ΠŸΠΎΡ‚ΠΎΠΊ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ досчитал Π΄ΠΎ 1000000000ΠŸΠΎΡ‚ΠΎΠΊ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ досчитал Π΄ΠΎ 23996334Будя ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ, высокоприоритСтный ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΎΠΊΠΎΠ»ΠΎ 98% всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ,ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ для выполнСния этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. РазумССтся, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ быстродСйствия ЦП ΠΈ числа Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡,Ρ€Π΅ΡˆΠ°Π΅ΠΌΡ‹Ρ… Π² систСмС, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ вСрсии Windows.ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ вСсти сСбя ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… срСдах, поэтомуникогда Π½Π΅ слСдуСт ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π΅Π³ΠΎ выполнСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ срСдС.Π’Π°ΠΊ, Π±Ρ‹Π»ΠΎ Π±Ρ‹ ошибкой ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½ΠΈΠ·ΠΊΠΎΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ всСгда Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ лишь Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ нСбольшого ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄ΠΎΡ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ высокоприоритСтный ΠΏΠΎΡ‚ΠΎΠΊ. Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΉ срСдС высокоприоритСтный ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ Π΅Ρ‰Π΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π½ΠΈΠ·ΠΊΠΎΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉΠΏΠΎΡ‚ΠΎΠΊ выполнится хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·.Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡΠšΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‚ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° приходится ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ дСйствия Π΄Π²ΡƒΡ… ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ΠŸΡ€ΠΎΡ†Π΅ΡΡ достиТСния Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΈ называСтсясинхронизациСй. Π‘Π°ΠΌΠΎΠΉ распространСнной ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ примСнСния синхронизации слуТит Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ срСди Π΄Π²ΡƒΡ… ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ±Ρ‰ΠΈΠΉ рСсурс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ. НапримСр, ΠΊΠΎΠ³Π΄Π° Π² ΠΎΠ΄Π½ΠΎΠΌΠΏΠΎΡ‚ΠΎΠΊΠ΅ выполняСтся запись ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² Ρ„Π°ΠΉΠ», Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π² Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Бинхронизация трСбуСтся ΠΈ Π² томслучаС, Ссли ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ событиС, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Π’ подобнойситуации Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ срСдства, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ событиС Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅. ПослС этого ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.Π’ основу синхронизации ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ понятиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, посрСдством ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ организуСтся ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ доступом ΠΊ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΌΡƒ Π±Π»ΠΎΠΊΡƒ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅. Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΌΡƒ Π±Π»ΠΎΠΊΡƒ. Когда ΠΆΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° снимаСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ становитсядоступным для использования Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅.БрСдство Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ встроСно Π² язык Π‘#. Благодаря этому всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. Бинхронизация организуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова lock.Она Π±Ρ‹Π»Π° прСдусмотрСна Π² C# с самого Π½Π°Ρ‡Π°Π»Π°, ΠΈ поэтому ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Сю Π½Π°ΠΌΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ каТСтся Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ синхронизация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²ΠΎΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π½Π° Π‘# происходит практичСски Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ.НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° общая Ρ„ΠΎΡ€ΠΌΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ:lock(lockObj) {// синхронизируСмыС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹}Π³Π΄Π΅ lockObj ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ссылку Π½Π° синхронизируСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Если ΠΆΠ΅ трСбуСтся ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, Ρ‚ΠΎ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ lockΠ³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅ΠΌ эту Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. А всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ снята. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° снимаСтсяпо Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Сю Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°.Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ считаСтся Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт синхронизируСмыйрСсурс. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΈΠΌ оказываСтся экзСмпляр самого рСсурса ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ для синхронизации. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚, ΠΎΠ΄Π½Π°ΠΊΠΎ,ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ общСдоступным, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° ΠΈ Π² дальнСйшСм Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ разблокируСтся. Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ дляблокировки ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΡ‡Π΅Π½ΡŒ часто ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»Π°ΡΡŒ конструкция lock(this). Но ΠΎΠ½Π° ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли this являСтся ссылкой Π½Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’ связи свозмоТными ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ ΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ошибками, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти конструкция lock(this), ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π΅ большС Π½Π΅ рСкомСндуСтся. ВмСсто Π½Π΅Π΅Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. ИмСнно Ρ‚Π°ΠΊΠΎΠΉ подходпринят Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅. Но Π² унаслСдованномкодС C# ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ примСнСния конструкции lock(this).Π’ ΠΎΠ΄Π½ΠΈΡ… случаях Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ оказываСтся бСзопасным, Π° Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… β€” Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉΠ²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… ослоТнСний ΠΏΡ€ΠΈ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ.Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ синхронизация дСмонстрируСтся Π½Π° примСрСуправлСния доступом ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ SumIt(), ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌΡƒ элСмСнты цСлочислСнногомассива.// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ для синхронизации доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ.using System;using System.Threading;class SumArray {int sum;object lockOn = new object(); // Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, доступный// для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈpublic int SumIt(int[] nums) {lock(lockOn) { // Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вСсь ΠΌΠ΅Ρ‚ΠΎΠ΄sum = 0; // ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ суммыfor(int i=0; i < nums.Length; i++) {sum += nums[i];Console.WriteLine("ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° " +Thread.CurrentThread.Name + " Ρ€Π°Π²Π½Π° " + sum);Thread.Sleep(10); // Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡}return sum;}}}class MyThread {public Thread Thrd;int[] a;int answer;// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° SumArray для всСх// экзСмпляров класса MyThread.static SumArray sa = new SumArray();// Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ,public MyThread(string name, int[] nums) {a = nums;Thrd = new Thread(this.Run);Thrd.Name = name;Thrd.Start(); // Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ}// ΠΠ°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.void Run() {Console.WriteLine(Thrd.Name + " Π½Π°Ρ‡Π°Ρ‚.");answer = sa.SumIt(a);Console.WriteLine("Π‘ΡƒΠΌΠΌΠ° для ΠΏΠΎΡ‚ΠΎΠΊΠ° " + Thrd.Name + " Ρ€Π°Π²Π½Π° " + answer);Console.WriteLine(Thrd.Name + " Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");}}class Sync {static void Main() {int[] a = {1, 2, 3, 4, 5);MyThread mt1 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1", a);MyThread mt2 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2", a);mt1.Thrd.Join();mt2.Thrd.Join();}}НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, хотя Ρƒ вас ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСсколько ΠΈΠ½Ρ‹ΠΌ.ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π½Π°Ρ‡Π°Ρ‚.ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Ρ€Π°Π²Π½Π° 1ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π½Π°Ρ‡Π°Ρ‚.ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Ρ€Π°Π²Π½Π° 3ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Ρ€Π°Π²Π½Π° 6ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Ρ€Π°Π²Π½Π° 10ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Ρ€Π°Π²Π½Π° 15ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 1Π‘ΡƒΠΌΠΌΠ° для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Ρ€Π°Π²Π½Π° 15ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 3ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 6ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 10ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 15Π‘ΡƒΠΌΠΌΠ° для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 15ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Как слСдуСт ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Π² ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ подсчитываСтся сумма, равная 15.Рассмотрим эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. Π‘Π½Π°Ρ‡Π°Π»Π° Π² Π½Π΅ΠΉ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ класса.ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈΠ· Π½ΠΈΡ… оказываСтся класс SumArray, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ опрСдСляСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ SumIt(),ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ элСмСнты цСлочислСнного массива. Π’Ρ‚ΠΎΡ€Ρ‹ΠΌ создаСтся класс MyThread,Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ статичСский ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ sa Ρ‚ΠΈΠΏΠ° SumArray. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, СдинствСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° SumArray ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ всСми ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° MyThread. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° получаСтся сумма элСмСнтов цСлочислСнного массива. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ тСкущая сумма запоминаСтся Π² ΠΏΠΎΠ»Π΅ sum ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° SumArray.ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли ΠΌΠ΅Ρ‚ΠΎΠ΄ SumIt() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π² Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…, Ρ‚ΠΎ ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΏΠΎΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ полю sum, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Π½Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ сумму. А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкам, Ρ‚ΠΎ доступ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ SumIt() Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ классС, Sync, ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π² которыхподсчитываСтся сумма элСмСнтов цСлочислСнного массива.ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ lock Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ SumIt() прСпятствуСт ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌΡƒ использованиюданного ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ lock ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ lockOn ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС синхронизируСмого. Π­Ρ‚ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для синхронизации. ΠœΠ΅Ρ‚ΠΎΠ΄ Sleep() Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ вызываСтсядля Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡, хотя Π² Π΄Π°Π½Π½ΠΎΠΌ случаС это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Код Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ SumIt() Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, ΠΈ поэтому ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ использован Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π²Ρ‚ΠΎΡ€ΠΎΠΉΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΎΠ½ Π½Π΅ смоТСт Π²ΠΎΠΉΡ‚ΠΈ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ SumIt() Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΈΠ· Π½Π΅Π³ΠΎ Π½Π΅Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Благодаря этому гарантируСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡƒΡΡΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ дСйствия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· рассматриваСмой здСсь ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π΅Π»ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° SumIt(). Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄SumIt() пСрСстанСт Π±Ρ‹Ρ‚ΡŒ синхронизированным, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² любом числС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ тСкущая сумма сохраняСтся Π² ΠΏΠΎΠ»Π΅ sum, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅,Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ SumIt(). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ SumIt() для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ получаСтсянСвСрным, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ содСрТимоС поля sum ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΡΠΌΠ΅ΡˆΠ°Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ суммирования Π² ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСниярассматриваСмой здСсь ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ послС снятия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π° SumIt().ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π½Π°Ρ‡Π°Ρ‚.ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Ρ€Π°Π²Π½Π° 1ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π½Π°Ρ‡Π°Ρ‚.ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 1ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Ρ€Π°Π²Π½Π° 3ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 5ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Ρ€Π°Π²Π½Π° 8ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 11ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Ρ€Π°Π²Π½Π° 15ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 19ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Ρ€Π°Π²Π½Π° 24ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 29Π‘ΡƒΠΌΠΌΠ° для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Ρ€Π°Π²Π½Π° 29ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.ВСкущая сумма для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 29ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.Как слСдуСт ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Π² ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ SumIt() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π° это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΠΊ искаТСнию значСния Π² ΠΏΠΎΠ΄Π΅ sum.НиТС ΠΏΠΎΠ΄Π²Π΅Π΄Π΅Π½Ρ‹ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠ΅ ΠΈΡ‚ΠΎΠ³ΠΈ использования Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ.β€’ Если Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° любого Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Ρ‚ΠΎ послСблокировки ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΠ½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅.β€’ ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ, ΠΏΡ‹Ρ‚Π°ΡŽΡ‰ΠΈΠΌΡΡ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ самого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, придСтся ΠΆΠ΄Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ окаТСтся Π² разблокированномсостоянии.β€’ Когда ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉΠΎΠ±ΡŠΠ΅ΠΊΡ‚ разблокируСтся.Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ синхронизации потоковНСсмотря Π½Π° всю простоту ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΊΠΎΠ΄Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎΠ² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ρ‚Π°ΠΊΠΎΠ΅ срСдство синхронизации оказываСтся ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌΠ΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всСгда. Допустим, Ρ‡Ρ‚ΠΎ трСбуСтся ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ класса,ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» создан ΠΊΠ΅ΠΌ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈ сам Π½Π΅ синхронизирован. Подобная ситуациявполнС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΏΡ€ΠΈ использовании Ρ‡ΡƒΠΆΠΎΠ³ΠΎ класса, исходный ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ нСдоступСн. Π’ этом случаС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ lock нСльзя ввСсти Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ чуТогокласса. Как ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π° ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ класса? К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, этот Π²ΠΎΠΏΡ€ΠΎΡΡ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ довольно просто: доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ ΠΈΠ· внСшнСго ΠΊΠΎΠ΄Π° ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, для Ρ‡Π΅Π³ΠΎ Π΄ΠΎ