Студопедия

Главная страница Случайная лекция


Мы поможем в написании ваших работ!

Порталы:

БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика



Мы поможем в написании ваших работ!




Мьютексы

Для решения проблемы взаимного исключения между параллельными потоками, которые выполняются в контекстах разных процессов, в Windows используется объект ядра системы с названием Mutex.

Мьютекс находится в сигнальном, то есть свободном состоянии, если он не принадлежит ни одному потоку. В противном случае, мьютекс находится в несигнальном, занятом, состоянии. Это состояние говорит о том, что один из потоков использует разделяемый ресурс. Одновременно, мьютекс может принадлежать только одному потоку. Остальные потоки находятся в состоянии ожидания освобождения мьютекса, то есть перехода его в сигнальное состояние. Все эти потоки обслуживаются в порядке дисциплины FIFO, то есть они становятся в очередь к мьютексу, и выбираются из очереди в соответствии с этой дисциплиной. Но в том случае, если какой-либо поток ожидает наступления некоторого асинхронного события, то есть внешнего по отношению к системе, то функции ядра системы могут исключить поток из очереди к мьютексу для обслуживания этого события. После этого, поток снова становится в очередь к мьютексу, но в её конец.

Мьютекс создается вызовом в потоке функции CreateMutex, которая имеет следующий формат:

CreateMutex (p1, p2, p3);

· p1 – атрибуты защиты объекта;

· p2 – начальный владелец;

· p3 – имя мьютекса.

При установке p1 в NULL атрибуты защиты устанавливаются по умолчанию. В этом случае, дескриптор мьютекса не наследуется в других потоках и открыт для них.

Если p2 == true, то мьютекс сразу переходит во владение того потока, в котором был создан. Такой поток имеет все права доступа к мьютексу. Если p2 == false, то созданный мьютекс свободен.

Значение p3 задает уникальное имя мьютекса для всех процессов, выполняющихся под управлением ОС, то есть имя мьютекса как объекта является общесистемной характеристикой. Оно позволяет обращаться к мьютексу из других процессов, запущенных в текущем сеансе работы ОС. Длина имени не должна превышать некоторого максимального значения, устанавливаемого в системе. Значением p3 может быть пустой указатель. В этом случае создается безымянный мьютекс.

В случае удачного завершения функция CreateMutex возвращает дескриптор созданного объекта, который может использоваться в других функциях. При неудаче возвращается ноль.

Если мьютекс с заданным в p3 именем уже существует, то функция CreateMutex возвращает дескриптор уже созданного мьютекса, а функция GetLastError, вызванная после функции CreateMutex, возвращает значение ошибки в виде именованной константы ERROR_ALREADY_EXISTS.

Мьютекс захватывается потоком, если он свободен, с помощью любой функции ожидания, и освобождается функцией ReleaseMutex(Handle). В случае успешного завершения эта функция возвращает ненулевое значение, а в случае неудач возвращает ноль.

Если поток освобождает мьютекс, которым он не владеет, то данная функция также возвращает ноль.

Для доступа к уже существующему мьютексу поток может использовать одну из двух функций:

· CreateMutex (p1,p2,p3);

· OpenMutex ();

CreateMutex используется, если поток не имеет информации о том, создан, или нет, мьютекс с таким же именем в другом потоке. В этом случае, p2 нужно задавать как false, поскольку невозможно определить, какой из потоков создает мьютекс.

При использовании для доступа к уже созданному мьютексу CreateMutex, поток получает полный доступ к мьютексу.

Чтобы получить доступ к уже созданному мьютексу, может использоваться OpenMutex (po1, po2, po3);

· po1 – вид доступа к мьютексу;

· po2 – определяет свойства наследования мьютекса;

· po3 – имя мьютекса.

po1 может иметь два значения:

1) полный доступ к мьютексу;

2) синхронизация. В этом случае, поток может использовать мьютекс только в функциях ожидания, чтобы захватить его, или в функции ReleaseMutex, чтобы освободить его.

Если po2 имеет значение истины, то дескриптор открываемого мьютекса является наследуемым в других дочерних потоках.

В случае успешного завершения, функция OpenMutex возвращает дескриптор открытого мьютекса, а в противном случае – ноль.


<== предыдущая страница | следующая страница ==>
Синхронизация с помощью критических секций | 

Дата добавления: 2014-10-10; просмотров: 314; Нарушение авторских прав




Мы поможем в написании ваших работ!
lektsiopedia.org - Лекциопедия - 2013 год. | Страница сгенерирована за: 0.003 сек.