Операционные системы. Замятин А.В - 67 стр.

UptoLike

Составители: 

67
Как следует из вышесказанного, при входе в критическую секцию
поток должен выполнять операцию P(S), а при выходе из критической
секции операцию V(S).
Прототипы функций для манипуляции с семафорами описываются
в файле <semaphore.h>. Ниже приводятся прототипы функций вместе с
пояснением их синтаксиса и выполняемых ими действий:
int sem_init(sem_t* sem, int pshared, unsigned int value) ини-
циализация семафора sem значением value. В качестве pshared всегда
необходимо указывать 0;
int sem_wait(sem_t* sem) «ожидание на семафоре». Выполне-
ние потока блокируется до тех пор, пока значение семафора не станет
положительным. При этом значение семафора уменьшается на 1;
int sem_post(sem_t* sem) увеличивает значение семафора sem
на 1;
int sem_destroy(sem_t* sem) уничтожает семафор sem;
int sem_trywait(sem_t* sem) неблокирующий вариант функции
sem_wait. При этом вместо блокировки вызвавшего потока функция
возвращает управление с кодом ошибки в качестве результата работы.
Синхронизация с использованием условной переменной
Условная переменная позволяет потокам ожидать выполнения не-
которого условия (события), связанного с разделяемыми данными. Над
условными переменными определены две основные операции: инфор-
мирование о наступлении события и ожидание события. При выполне-
нии операции «информирование» один из потоков, ожидающих значе-
ния условной переменной, возобновляет свою работу.
Условная переменная всегда используется совместно с мьютексом.
Перед выполнением операции «ожидание» поток должен заблокировать
мьютекс. При выполнении операции «ожидание» указанный мьютекс ав-
томатически разблокируется. Перед возобновлением ожидающего потока
выполняется автоматическая блокировка мьютекса, позволяющая потоку
войти в критическую секцию, после критической секции рекомендуется
разблокировать мьютекс. При подаче сигнала другим потокам рекомен-
дуется функцию «сигнализации» так же защитить мьютексом.
Прототипы функций для работы с условными переменными содер-
жатся в файле pthread.h. Ниже приводятся прототипы функций вместе с
пояснением их синтаксиса и выполняемых ими действий:
pthread_cond_init(pthread_cond_t*cond, const pthread_condattr_t*
attr) инициализирует условную переменную cond с указанными атри-
бутами attr или с атрибутами по умолчанию (при указании 0 в качест-
ве attr);