Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpora_1-10_bez_vosmogo1 (1).docx
Скачиваний:
4
Добавлен:
16.04.2019
Размер:
133.72 Кб
Скачать

45)Синхронізація потоків. Функції та використання моніторів.

Монитор используется для предотвращения взаимного исключения ,когда один ресурс одновременно может использоваться только одним процессом. Монитор – это обьект специального типа. Установка и снятие блокировки выполняется с помощью функций монитора. Функции монитора выполняются в режиме взаимного исключения. Монитор имеет функцию инициализации (формирует начальные значения внутренних переменных), блокирования (посылает сообщение модулю ОС о необходимости блокирования процесса), исправления состояния (возвращает значение, есть ли процессы, которые ждут доступа к ресурсу) и функции. Сигнализации процесса (извещает ОС об освобождении заданного ресурса). Пример использования монитора, когда каждый процесс имеет свою критическую секцию:

CSBegin()(if(!Busy)Busy = true; else CriticalSection.Wait();)

CSEnd(|(Busy == false; Critical Section.Signed();)

Структура процессов с критическими секциями:

46)Синхронізація. Поняття та використання семафора для критичної секції.

Дейкстра ввел два примитива, используемые для связи процессов. Эти примитивы оперируют неотрицательными целыми числами, которые называются семафорами. Для семафоров определены операции inc(V(S)) и dec(P(S)), которые должны быть неделимыми, то есть во время выполнения этих операций не должно быть перехода на другой процесс. P(S) соответствует выделению ресурса, V(S) – освобождению. Если несколько процессов требуют одновременного выполнения разных операций над одним и тем же семафором, то эти операции выполняются последовательно в произвольном порядке. В данном случае семафор называется двоичным семафором. Он используется как замок, который запрещает прерывание КС для выполнения такой же секции в другом процессе. Этот метод легко распространять на следующие случаи:

- количество конкурирующих процессов более двух.

- количество ресурсов более одного

Использование семафора в критической секции:

Semaphore s = 1;

// Процесс 1 // Процесс 2

P(S); P(S);

// Критическая секція // Критическая секция

… …

V(S); V(S);

47. Синхронізація потоків. Атомарний доступ.

Для атомарного доступа используется специальный класс Interlocked функций. Эти функции позволяют, например:

— изменить значение переменной, заданной своим адресом на заданную величину;

— обменять значения двух переменных, заданных своими адресами;

— проверить значение переменной и изменить его в заданном случае.

Адреса всех переменных, которые задаются в функциях этого класса, должны быть выровнены на границу 32-битного слова, т.е. быть кратными 4. Для переменных, объявленных в языке С++, это гарантируется.

Рассмотрим примеры этих функций:

1. Для присвоения заданного значения переменной в режиме эксклюзивного доступа используется функция InterlockedExchange:

LONG InterlockedExchange(

LONG volatile* Target,

LONG Value);

2. Для изменения значения переменной на постоянную величину (х += а) в режиме эксклюзивного доступа используется функция InterlockedExchangeAdd:

LONG IntertockeOExchangeAdd(

LPLONG volatile Addend,

LONG Value);

3. Для присвоения переменной значения другой переменной используется функция InterlockedExchangePointer:

PVOID InterlockedExchangePointer(

PVOID volatile* Target,

PVOID Value);

В этой функции оба параметра являются адресами переменных, исходной (Value) и результата (Target).

Пример использования функции:

volatile LONG IVar = 0;

LONG Value = 5;

lnterlockedExchangePointer( &IVar, &Value);

Функция InterlockedCompareExchange

LONG lnterlockedCornpareExchange(

LONG volatile* Destination,

LONG Exchange,

LONG Comperand);

Функция сравнивает значения Destination и Comperand. Если

Destination == Comperand, то значение Exchange записывается

в Destination, в противном случае Destination не изменяется.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]