Есть класс, выполняющий роль общего ресурса:
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-го потока до любого из общих ресурсов?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотел бы использовать универсальную функцию для вывода гистограммыТ
Не совсем понимаю, почему не получается подключить класс к GridResources
В чем разница, если она существует (в теории и на практике), между делегатами MethodInvoker и Action ?