Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Судаков / Лекции / lec15_sinxr.ppt
Скачиваний:
20
Добавлен:
20.03.2015
Размер:
253.44 Кб
Скачать

Mutex

Mutex – семафор с начальным значение 1

Используется для взаимоисключающего доступа

Пример:

//Общий связанный список

List l;

Поток записи

Semaphore mutex(1); down(mutex);

// mutex=0 insert(list);

up(mutex);

Поток чтения

down(mutex);

read(list);

up(mutex);

Счетный семафор

Семафор со значением большим 1 может использоваться в качестве атомарного счетчика

Semaphore a(1);

Поток 1 Поток 2

Up(a); read(a);

Реализация семафоров

Блокировка с помощью очереди

Счетчик семафора

Очередь процессов, которые захватывают семафор

Очередь защищается спин-блокировкой

Как только семафор становится меньшим нуля, процессы при захвате добавляются в очередь

При отпускании семафора процессы извлекаются из очереди

Пример реализации семафора

Spinlock l;

//процесс из очереди

Int count;

proc

Queue q;

 

//текущий процесс

Up() {

current

lock(l);

 

proc=queue.relese();

down(){

count++;

lock(l)

unlock();

if(count>0) {

start(proc);

count--;

}

unlock(l);

 

} else {

 

queue.insert(current);

 

unlock(l);

 

stop(current)

 

}

 

}

 

Семафоры чтения записи

По аналогии со спин блокировками чтения записи

Особенности семафоров

Семафоры обычно реализуются операционными системами

По сравнению со спин-блокировкой семафор – «тяжелая» операция, требующая много времени

Условные переменные

Условная переменная – вид блокировки, которая позволяет информировать процессы о наступлении некоторого события

Пример – срабатывание будильника

Пример использование

Event e;

Потоки, ожидающие на события

e.wait();

//ожидаем, пока событие не наступит

Потоки, сигнализирующие о событиях

e.signal();

// все ожидающие потоки возвращаются к выполнению

Мониторы

Монитор – объект

Данные+методы безопасного доступа к этим данным

Обеспечивает обязательную блокировку в отличие от всех предыдущих способов

Counter{ int c;

semaphore s; public:

int operator ++(){…} int operator --(){…}

}

Соседние файлы в папке Лекции