Использование Mutex C#

112
08 октября 2021, 21:50

Есть класс, выполняющий роль общего ресурса:

using System;
using System.Threading;
//В этом классе содержится общий ресурс(переменная Count),
// а также мьютекс (Mtx), управляющий доступом к ней.
class SharedRes {
  public static int Count = 0;
  public static Mutex Mtx = new Mutex();
}

Мне известно, как применить Mutex для одного общего ресурса(2 потока):

// В этом потоке переменная 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();
  }
}

А что, если общих ресурсов 2? Например добавим класс:

using System;
using System.Threading;
//В этом классе содержится общий ресурс(переменная Count),
// а также мьютекс (Mtx), управляющий доступом к ней.
class SharedResTwo {
  public static int CountTwo = 0;
  public static Mutex Mtx = new Mutex();
}

Как в таком случае организовать работу по доступу только 1-го потока до любого из общих ресурсов?

READ ALSO
Как передать в функцию название элементов формы?

Как передать в функцию название элементов формы?

Хотел бы использовать универсальную функцию для вывода гистограммыТ

142
The name doesn't exist in namespace. Ошибка с присоединением Grid.Resources

The name doesn't exist in namespace. Ошибка с присоединением Grid.Resources

Не совсем понимаю, почему не получается подключить класс к GridResources

101
C# MethodInvoker vs Action

C# MethodInvoker vs Action

В чем разница, если она существует (в теории и на практике), между делегатами MethodInvoker и Action ?

114