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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# 4.0 ΠΏΠΎΠ»Π½ΠΎΠ΅ руководство - 2011Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 210

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

} .

} while(stop == false && Count < 1000000000); stop = true;

Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΊ " + Thrd.Name + " Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");

}

}

class PriorityDemo { static void Main() {

MyThread mtl = new MyThread("с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ"); MyThread mt2 = new MyThread("с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ");

// Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρ‹ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

mtl.Thrd.Priority = ThreadPriority.AboveNormal;

mt2.Thrd.Priority = ThreadPriority.BelowNormal;

// ΠΠ°Ρ‡Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, mtl.Thrd.Start(); mt2.Thrd.Start() ;

mtl.Thrd.Join (); mt2.Thrd.Join();

Console.WriteLine();

Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΊ " + mtl.Thrd.Name +

" досчитал Π΄ΠΎ " + mtl.Count);

Console.WriteLine("ΠŸΠΎΡ‚ΠΎΠΊ " + mt2.Thrd.Name +

" досчитал Π΄ΠΎ " + mt2.Count);

}

}

Π’ΠΎΡ‚ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΠΎΡ‚ΠΎΠΊ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π½Π°Ρ‡Π°Ρ‚.

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΠŸΠΎΡ‚ΠΎΠΊ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π½Π°Ρ‡Π°Ρ‚.

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΠŸΠΎΡ‚ΠΎΠΊ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

ΠŸΠΎΡ‚ΠΎΠΊ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

ΠŸΠΎΡ‚ΠΎΠΊ с высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ досчитал Π΄ΠΎ 1000000000 ΠŸΠΎΡ‚ΠΎΠΊ с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ досчитал Π΄ΠΎ 23996334

Будя ΠΏΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ, высокоприоритСтный ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΎΠΊΠΎΠ»ΠΎ 98% всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ для выполнСния этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. РазумССтся, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ быстродСйствия ЦП ΠΈ числа Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡, Ρ€Π΅ΡˆΠ°Π΅ΠΌΡ‹Ρ… Π² систСмС, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ вСрсии Windows.

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

Бинхронизация

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

Π’ основу синхронизации ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ понятиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, посрСдством ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ организуСтся ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ доступом ΠΊ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΌΡƒ Π±Π»ΠΎΠΊΡƒ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅. Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΌΡƒ Π±Π»ΠΎΠΊΡƒ. Когда ΠΆΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° снимаСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ становится доступным для использования Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅.

БрСдство Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ встроСно Π² язык Π‘#. Благодаря этому всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ синхронизированы. Бинхронизация организуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова lock. Она Π±Ρ‹Π»Π° прСдусмотрСна Π² C# с самого Π½Π°Ρ‡Π°Π»Π°, ΠΈ поэтому ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Сю Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ каТСтся Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ синхронизация ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π½Π° C# происходит практичСски Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° общая Ρ„ΠΎΡ€ΠΌΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ:

lock(lockObj) {

// синхронизируСмыС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

}

Π³Π΄Π΅ lockObj ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ссылку Π½Π° синхронизируСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Если ΠΆΠ΅ трСбуСтся ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, Ρ‚ΠΎ Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ lock Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅ΠΌ эту Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. А всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ снята. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° снимаСтся ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Сю Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π°.

Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ считаСтся Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт синхронизируСмый рСсурс. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΈΠΌ оказываСтся экзСмпляр самого рСсурса ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ для синхронизации. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ общСдоступным, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠ΄Π° ΠΈ Π² дальнСйшСм Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ разблокируСтся. Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΡ‡Π΅Π½ΡŒ часто ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»Π°ΡΡŒ конструкция lock (this). Но ΠΎΠ½Π° ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли this являСтся ссылкой Π½Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’ связи с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ ΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ошибками, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти конструкция lock (this), ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π΅ большС Π½Π΅ рСкомСндуСтся. ВмСсто Π½Π΅Π΅ Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. ИмСнно Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ принят Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅. Но Π² унаслСдованном ΠΊΠΎΠ΄Π΅ C# ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ примСнСния конструкции lock (this). Π’ ΠΎΠ΄Π½ΠΈΡ… случаях Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ оказываСтся бСзопасным, Π° Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… β€” Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… ослоТнСний ΠΏΡ€ΠΈ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ синхронизация дСмонстрируСтся Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ управлСния доступом ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Sumlt (), ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌΡƒ элСмСнты цСлочислСнного массива.

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ для синхронизации доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ.

using System;

using System.Threading;

class SumArray { int sum;

object lockOn = new object(); // Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, доступный

// для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

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.Sumlt(a);

Console.WriteLine("Π‘ΡƒΠΌΠΌΠ° для ΠΏΠΎΡ‚ΠΎΠΊΠ° " + Thrd.Name + " Ρ€Π°Π²Π½Π° " + answer); Console.WriteLine(Thrd.Name + " Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.");

}

}

class Sync {

static void Main() {

int[] a = {1, 2, 3, 4, 5};

MyThread mtl = new MyThread ("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1", a);.

MyThread mt2 = new MyThread("ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2", a);

mtl.Thrd.Join(); mt2.Thrd.Join() ;

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, хотя Ρƒ вас ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСсколько ΠΈΠ½Ρ‹ΠΌ.

ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #1 Π½Π°Ρ‡Π°Ρ‚.

Π‘ΡƒΠΌΠΌΠ° для ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Ρ€Π°Π²Π½Π° 15 ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ #2 Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

Как слСдуСт ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Π² ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ подсчитываСтся сумма, равная 15.

Рассмотрим эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. Π‘Π½Π°Ρ‡Π°Π»Π° Π² Π½Π΅ΠΉ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ класса. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈΠ· Π½ΠΈΡ… оказываСтся класс SumArray, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ опрСдСляСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ Sumlt (), ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ элСмСнты цСлочислСнного массива. Π’Ρ‚ΠΎΡ€Ρ‹ΠΌ создаСтся класс MyThread, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ статичСский ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ sa Ρ‚ΠΈΠΏΠ° SumArray. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, СдинствСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° SumArray ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ всСми ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° MyThread. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° получаСтся сумма элСмСнтов цСлочислСнного массива. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ тСкущая сумма запоминаСтся Π² ΠΏΠΎΠ»Π΅ sum ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° SumArray. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли ΠΌΠ΅Ρ‚ΠΎΠ΄ Sumlt () ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π² Π΄Π²ΡƒΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…, Ρ‚ΠΎ ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΠΎΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ полю sum, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Π½Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ сумму. А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкам, Ρ‚ΠΎ доступ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Sumlt () Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ синхронизирован. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ классС, Sync, ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… подсчитываСтся сумма элСмСнтов цСлочислСнного массива.