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

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

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

Ρ‚ΠΈΠΊ Ρ‚ΠΈΠΊ Ρ‚ΠΈΠΊ Ρ‚ΠΈΠΊ Ρ‚ΠΈΠΊ Ρ‚Π°ΠΊ

Ρ‚Π°ΠΊ

Ρ‚Π°ΠΊ

Ρ‚Π°ΠΊ

Ρ‚Π°ΠΊ

Часы остановлСны

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Tick () ΠΈ Tock () большС Π½Π΅ синхронизированы!

Π’Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈ состояниС Π³ΠΎΠ½ΠΊΠΈ

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ слСдуСт Π±Ρ‹Ρ‚ΡŒ особСнно Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ состояний Π³ΠΎΠ½ΠΎΠΊ. Π’Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ само Π½Π°Π·Π²Π°Π½ΠΈΠ΅, β€” это ситуация, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… дСйствий ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ, оТидая Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°, ΠΈ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Π½Π΅ выполняСтся. Π­Ρ‚Π° ситуация Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ Π΄Π²ΡƒΡ… слишком Π²Π΅ΠΆΠ»ΠΈΠ²Ρ‹Ρ… людСй, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… настаиваСт Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΡˆΠ΅Π» Π² Π΄Π²Π΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ!

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ всС Ρ‚Π°ΠΊ просто, вСдь Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΎΠΊΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ путями. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим класс TickTock ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Как пояснялось Π²Ρ‹ΡˆΠ΅, Π² отсутствиС Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Pulse () ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Tick () ΠΈΠ»ΠΈ Tock () Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π΄ΠΎ бСсконСчности, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ "зависанию" ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ вслСдствиС Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π΅ Ρ‚Π°ΠΊ-Ρ‚ΠΎ просто Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, анализируя исходный ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ процСссы ΠΌΠΎΠ³ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ довольно слоТным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²ΠΎ врСмя выполнСния. Для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ трСбуСтся Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ тСстированиС. Π’ Ρ†Π΅Π»ΠΎΠΌ, Ссли многопоточная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° пСриодичСски "зависаСт", Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ вСроятной ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ этого являСтся Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°.

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

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° MethodlmplAttribute

ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ синхронизирован с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° MethodlmplAttribute. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ lock Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ трСбуСтся Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ. Атрибут

MethodlmplAttΠ³ibute ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² пространствС ΠΈΠΌΠ΅Π½ System . Runtime . CompilerServices. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ конструктор, примСняСмый для ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ синхронизации:

public MethodlmplAttribute(MethodlmplOptions methodlmplOptions)

Π³Π΄Π΅ methodlmplOptions ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Для синхронизации ΠΌΠ΅Ρ‚ΠΎΠ΄Π° достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ MethodlmplOptions. Synchronized. Π­Ρ‚ΠΎΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ всСго ΠΌΠ΅Ρ‚ΠΎΠ΄Π° для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ экзСмпляра ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, доступного ΠΏΠΎ ссылкС this. Если ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ относится ΠΊ Ρ‚ΠΈΠΏΡƒ static, Ρ‚ΠΎ блокируСтся Π΅Π³ΠΎ Ρ‚ΠΈΠΏ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°Π½Π½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π½Π΅ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π΅Π½ для примСнСния Π² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… ΠΈΠ»ΠΈ классах.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° вСрсия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚ΠΈΠΊΠ°Π½ΡŒΠ΅ часов, с ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Π½Π½Ρ‹ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ класса TickTock, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ MethodlmplOptions обСспСчиваСт Π΄ΠΎΠ»ΠΆΠ½ΡƒΡŽ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ.

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ MethodlmplAttribute для синхронизации ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

using System;

using System.Threading;

using System.Runtime.CompilerServices;

// Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ класса TickTock, ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Π½Π½Ρ‹ΠΉ с Ρ†Π΅Π»ΡŒΡŽ // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ MethodlmplOptions.Synchronized, class TickTock {

/* Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ синхронизируСт ΠΌΠ΅Ρ‚ΠΎΠ΄ Tick(). */ [MethodlmplAttribute(MethodlmplOptions.Synchronized)] public void Tick (bool running) { if(!running) { // ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ часы

Monitor.Pulse(this); // ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ return;

}

Console.Write("Ρ‚ΠΈΠΊ ");

Monitor.Pulse(this); // Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Tock()

Monitor.Wait(this);    //    ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Tock()

}

/* Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ синхронизируСт ΠΌΠ΅Ρ‚ΠΎΠ΄ Воск(). */ [MethodlmplAttribute(MethodlmplOptions.Synchronized)] public void Tock(bool running) { if (!running) { // ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ часы

Monitor.Pulse(this); // ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ return;

}'

Console.WriteLine("Ρ‚Π°ΠΊ");

Monitor.Pulse(this); // Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Tick()

Monitor.Wait(this);    //    ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Tick()

}

}

class MyThread {

public Thread Thrd;

TickTock ttOb;

// Π‘ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

public MyThread(string name, TickTock tt) {

Thrd = new Thread(this.Run); ttOb = tt;

Thrd.Name = name;

Thrd.Start();

}

// ΠΠ°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, void Run()    {

if(Thrd.Name == "Tick") {

for(int i=0; i<5; i++) ttOb.Tick(true); ttOb.Tick(false);

}

else {

for(int i=0; i<5; i++) ttOb.Tock(true); ttOb.Tock(false);

}

}

}

class TickingClock { static void Main() {

TickTock tt = new TickTock();

MyThread mtl = new MyThread("Tick", tt) ;

MyThread mt2 = new MyThread("Tock", tt) ;

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

Console.WriteLine("Часы остановлСны");

}

}

Π­Ρ‚Π° вСрсия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠ°ΠΊ ΠΈ прСдыдущая. Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ классС ΠΈ Π½Π΅ вызываСтся для ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, поэтому ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° lock ΠΈΠ»ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° MethodlmplAttribute зависит ΠΎΡ‚ Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ. Π’Π΅Π΄ΡŒ ΠΈ Ρ‚ΠΎΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово lock относится нСпосрСдствСнно ΠΊ языку Π‘#, Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² этой ΠΊΠ½ΠΈΠ³Π΅, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π΄Π°Π½ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅ΠΌΡƒ.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

НС примСняйтС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ MethodlmplAttribute Π² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… классах ΠΈΠ»ΠΈ экзСмплярах ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ВмСсто этого ΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ lock, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ для Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠ°ΠΊ пояснялось Ρ€Π°Π½Π΅Π΅.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈ сСмафора

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, ΠΊΠΎΠ³Π΄Π° трСбуСтся синхронизация, оказываСтся достаточно ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° lock. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΈ доступа ΠΊ ΠΎΠ±Ρ‰ΠΈΠΌ рСсурсам, Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ синхронизации, встроСнныС Π² срСду .NET Framework. НиТС Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ порядку Π΄Π²Π° Ρ‚Π°ΠΊΠΈΡ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ°: ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈ сСмафор.

ΠœΡŒΡŽΡ‚Π΅ΠΊΡ

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

ΠœΡŒΡŽΡ‚Π΅ΠΊΡ поддСрТиваСтся Π² классС System. Threading.Mutex. Π£ Π½Π΅Π³ΠΎ имССтся нСсколько конструкторов. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π΄Π²Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… конструктора.

public Mutex()

public Mutex(bool initiallyOwned)

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ конструктора создаСтся ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚. А Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ исходным состояниСм ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° Π·Π°Π²Π»Π°Π΄Π΅Π²Π°Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ini tiallyOwned ΠΈΠΌΠ΅Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ WaitOne () для этого ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. ΠœΠ΅Ρ‚ΠΎΠ΄ WaitOne () наслСдуСтся классом Mutex ΠΎΡ‚ класса Thread. WaitHandle. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π΅Π³ΠΎ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ°Ρ Ρ„ΠΎΡ€ΠΌΠ°.

public bool WaitOne ();

ΠœΠ΅Ρ‚ΠΎΠ΄ WaitOne () ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ станСт доступным ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ. Он всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true.

Когда ΠΆΠ΅ Π² ΠΊΠΎΠ΄Π΅ большС Π½Π΅ трСбуСтся Π²Π»Π°Π΄Π΅Ρ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΎΠ½ освобоТдаСтся посрСдством Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ReleaseMutex (), Ρ„ΠΎΡ€ΠΌΠ° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½ΠΈΠΆΠ΅.

public void ReleaseMutex()

Π’ этой Ρ„ΠΎΡ€ΠΌΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ ReleaseMutex () освобоТдаСт ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½, Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.