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

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

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

Для примСнСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° с Ρ†Π΅Π»ΡŒΡŽ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу упомянутыС Π²Ρ‹ΡˆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ WaitOne()  ΠΈ ReleaseMutex() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π°.


Mutex myMtx = new Mutex();

// ...

myMtx.WaitOne() ; // ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ получСния ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

            // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу.

myMtx.ReleaseMutex(); // ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ


ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° WaitOne() Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° приостанавливаСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ. А ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ReleaseMutex() ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ освобоТдаСтся ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Благодаря Ρ‚Π°ΠΊΠΎΠΌΡƒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ ΠΊ синхронизации ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступ ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу ограничиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ описанный Π²Ρ‹ΡˆΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ синхронизации дСмонстрируСтся Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Π’ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Π²ΠΈΠ΄Π΅ классов IncThread ΠΈ DecThread, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ трСбуСтся доступ ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу: ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ SharedRes.Count. Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ IncThread пСрСмСнная SharedRes.Count инкрСмСнтируСтся, Π° Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅ DecThread β€” дСкрСмСнтируСтся. Π’ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ доступа ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу SharedRes.Count этот доступ синхронизируСтся ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ Mtx, Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΌΡΡ Ρ‡Π»Π΅Π½ΠΎΠΌ класса SharedRes.


// ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

using System;

using System.Threading;


//Π’ этом классС содСрТится ΠΎΠ±Ρ‰ΠΈΠΉ рСсурс(пСрСмСнная Count),

// Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ (Mtx), ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ доступом ΠΊ Π½Π΅ΠΉ.

class SharedRes {

  public static int Count = 0;

  public static Mutex Mtx = new Mutex();

}


// Π’ этом ΠΏΠΎΡ‚ΠΎΠΊΠ΅ пСрСмСнная SharedRes.Count инкрСмСнтируСтся,

class IncThread {

  int num;

  public Thread Thrd;


  public IncThread(string name, int n) {

    Thrd = new Thread(this.Run);

    num = n;

    Thrd.Name = name;

    Thrd.Start();

  }


  // Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ,

  void Run() {

    Console.WriteLine(Thrd.Name + " ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.");

    // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

    SharedRes.Mtx.WaitOne();

    Console.WriteLine(Thrd.Name + " ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.");

    do {

      Thread.Sleep (500);

      SharedRes.Count++;

      Console.WriteLine("Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ " + Thrd.Name +

           ", SharedRes.Count = " + SharedRes.Count);

      num -- ;

    } while(num > 0);


    Console.WriteLine(Thrd.Name + " ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.");

    // ΠžΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

    SharedRes.Mtx.ReleaseMutex();

  }

}


// Π’ этом ΠΏΠΎΡ‚ΠΎΠΊΠ΅ пСрСмСнная SharedRes.Count дСкрСмСнтируСтся,

class DecThread {

  int num;

  public Thread Thrd;


  public DecThread(string name, int n) {

    Thrd = new Thread(new ThreadStart(this.Run));

    num = n;

    Thrd.Name = name;

    Thrd.Start();

  }


  // Π’ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΠΎΡ‚ΠΎΠΊ,

  void Run() {

    Console.WriteLine(Thrd.Name + " ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.");

    // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

    SharedRes.Mtx.WaitOne();

    Console.WriteLine(Thrd.Name + " ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.");

    do {

      Thread.Sleep(500) ;

      SharedRes.Count--;

      Console.WriteLine("Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ " + Thrd.Name +

             ", SharedRes.Count = " + SharedRes.Count);

      num-- ;

    } while(num > 0);

    Console.WriteLine(Thrd.Name + " ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.");

    // ΠžΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

    SharedRes.Mtx.ReleaseMutex();

  }

}

class MutexDemo {

  static void Main() {

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

    IncThread mt1 = new IncThread("Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ", 5);

    Thread.Sleep(1); // Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ

    DecThread mt2 = new DecThread("Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ", 5);


    mt1.Thrd.Join();

    mt2.Thrd.Join();

  }

}


Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.


Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 1

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 2

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 3

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 4

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 5

Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ освобоТдаСт ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 4

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 3

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 2

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 1

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 0

Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ освобоТдаСт ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.


Как слСдуСт ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, доступ ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу (ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ SharedRes.Count) синхронизирован, ΠΈ поэтому Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для получСния ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² WaitOne() ΠΈ ReleaseMutex() Π² исходном ΠΊΠΎΠ΄Π΅ рассматриваСмой здСсь ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€ΠΈ Π΅Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, хотя Ρƒ вас ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСсколько ΠΈΠ½Ρ‹ΠΌ.


Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 1

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 0

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 1

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 0

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 1

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 0

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 1

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 0

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 1

Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ освобоТдаСт ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.

Π’ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ, SharedRes.Count = 0

Π”Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠŸΠΎΡ‚ΠΎΠΊ освобоТдаСт ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ.


Как слСдуСт ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, Π±Π΅Π· ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ SharedRes.Count происходит, скорСС, бСспорядочно, Ρ‡Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

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


public Mutex(bool initiallyOwned, string имя)

public Mutex(bool initiallyOwned, string имя, out bool createdNew)


Π’ ΠΎΠ±Π΅ΠΈΡ… Ρ„ΠΎΡ€ΠΌΠ°Ρ… конструктора имя ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ имя ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°. Если Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ конструктора ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ini tiallyOwned ΠΈΠΌΠ΅Π΅Ρ‚ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ρ‚ΠΎ Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ процСссу Π½Π° систСмном ΡƒΡ€ΠΎΠ²Π½Π΅, Ρ‚ΠΎ для этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π»ΡƒΡ‡ΡˆΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false. А послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ конструктора ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ createdNew Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ссли Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ Π±Ρ‹Π»ΠΎ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ, ΠΈ логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false, Ссли запрос Π½Π° Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ Π±Ρ‹Π» ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½. БущСствуСт ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΡ Ρ„ΠΎΡ€ΠΌΠ° конструктора Ρ‚ΠΈΠΏΠ° Mutex, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ допускаСтся ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ доступом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° MutexSecurity. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ взаимодСйствиС процСссов.