- Автор темы
- #1
Мьютекс, критическая секция и другие механизмы синхронизации.
C понятием синхронизации и её механизмами вы уже сталкивались в курсе Visual C++. Теперь настала пора проанализировать их в контексте C#. Классы, связанные с проблемами синхронизации располагаются в пространстве System.Threading. Рассмотрим несколько из них чьи, методы используются в практических примерах. Наше знакомство, безусловно, начнем с класса Mutex, отвечающего за работу с мьютексами. Рассмотрим его иерархию наследования:
Обратите внимание на класс WaitHandle от которого наследуется класс Mutex. Мы данный класс рассмотрим ниже. При создании объекта типа мьютекс можно воспользоваться любым из перегруженных конструкторов, чьи прототипы указаны ниже:
Разберем для примера предпоследний прототип: Первый параметр bool – должен быть true, если вызывающий поток хочет захватить мьютекс, false в обратном случае; Второй параметр string – имя мьютекса, если его не указать будет использоваться мьютекс без имени; Третий параметр out bool - в него запишется true,если вызывающий поток получил в своё владение мьютекс, false в обратном случае.
Следующая функция вам, безусловно, знакома, даже по названию :
Переводит мьютекс в сигнальное состояние.
Теперь настало время переходить на методы класса WaitHandle, так как Mutex часть из них унаследовал. Нам необходимо рассмотреть метод класса WaitHandle под названием WaitOne:
WaitOne ожидает перехода некоторого объекта в сигнальное состояние. Одна версия отличается от другой количеством времени, в течение, которого производится ожидание или типом передаваемых аргументов. Также в классе WaitHandle есть функции схожего содержания под названиями WaitAll (ожидает перехода всех объектов некоторого множества в сигнальное состояние),WaitAny (ожидает перехода хотя бы одного объекта из множества в сигнальное состояние).
И последнее что мы вспомним в этом разделе это критическая секция. В C# она может быть поставлена 2 способами: 1)используя ключевое слово lock. Например:
2) Используя класс System.Threading.Monitor( lock - это всего лишь сокращение для этого класса). Например:
C понятием синхронизации и её механизмами вы уже сталкивались в курсе Visual C++. Теперь настала пора проанализировать их в контексте C#. Классы, связанные с проблемами синхронизации располагаются в пространстве System.Threading. Рассмотрим несколько из них чьи, методы используются в практических примерах. Наше знакомство, безусловно, начнем с класса Mutex, отвечающего за работу с мьютексами. Рассмотрим его иерархию наследования:
Код:
Object
MarshalByRefObject
WaitHandle
Mutex
Обратите внимание на класс WaitHandle от которого наследуется класс Mutex. Мы данный класс рассмотрим ниже. При создании объекта типа мьютекс можно воспользоваться любым из перегруженных конструкторов, чьи прототипы указаны ниже:
Код:
public Mutex();
public Mutex(bool);
public Mutex(bool, string, bool);
public Mutex(bool, string);
Разберем для примера предпоследний прототип: Первый параметр bool – должен быть true, если вызывающий поток хочет захватить мьютекс, false в обратном случае; Второй параметр string – имя мьютекса, если его не указать будет использоваться мьютекс без имени; Третий параметр out bool - в него запишется true,если вызывающий поток получил в своё владение мьютекс, false в обратном случае.
Следующая функция вам, безусловно, знакома, даже по названию :
Код:
public void ReleaseMutex();
Переводит мьютекс в сигнальное состояние.
Теперь настало время переходить на методы класса WaitHandle, так как Mutex часть из них унаследовал. Нам необходимо рассмотреть метод класса WaitHandle под названием WaitOne:
Код:
public virtual bool WaitOne();
public virtual bool WaitOne(int, bool);
public virtual bool WaitOne(TimeSpan, bool);
WaitOne ожидает перехода некоторого объекта в сигнальное состояние. Одна версия отличается от другой количеством времени, в течение, которого производится ожидание или типом передаваемых аргументов. Также в классе WaitHandle есть функции схожего содержания под названиями WaitAll (ожидает перехода всех объектов некоторого множества в сигнальное состояние),WaitAny (ожидает перехода хотя бы одного объекта из множества в сигнальное состояние).
И последнее что мы вспомним в этом разделе это критическая секция. В C# она может быть поставлена 2 способами: 1)используя ключевое слово lock. Например:
Код:
lock(this){
тело
}
2) Используя класс System.Threading.Monitor( lock - это всего лишь сокращение для этого класса). Например:
Код:
Monitor.Enter(this);
тело
Monitor.Exit(this);