Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Мьютекс, критическая секция и другие механизмы синхронизации.

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);


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru