• Добро пожаловать на сайт - Forumteam.digital !

    Что бы просматривать темы форума необходимо зарегестрироваться или войти в свой аккаунт.

    Группа в телеграме (подпишитесь, что бы не потерять нас) - ForumTeam Chat [Подписатся]
    Связь с администратором - @ftmadmin

51. Рассмотрим механизмы синхронизации.

Redman

<FORUMTEAM>
Команда форума
Регистрация
13.11.17
Сообщения
13.340
Реакции
8.377
Баллы
1.200
FTC
208¢
Мьютекс, критическая секция и другие механизмы синхронизации.
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);
 
Сверху Снизу