Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы по ОС.doc
Скачиваний:
50
Добавлен:
24.09.2019
Размер:
202.24 Кб
Скачать

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

Условные переменные используются для того, чтобы заблокировать потоки до выполнения определенных условий. Условные переменные обычно применяются в сочетании с взаимоисключающими блокировками, чтобы несколько потоков могли ожидать момента выполнения одного условия. Это можно сделать следующим образом. Сначала поток устанавливает взаимоисключающую блокировку, но и сам блокируется до момента выполнения определенного условия. На то время, пока поток заблокирован, установленная им блокировка автоматически снимается. Когда другой поток выполняет поставленное условие, он дает условной переменной сигнал о разблокировании первого потока. После разблокирования потока взаимоисключающая блокировка автоматически вновь устанавливается, и первый поток повторно проверяет условие. Если оно не выполняется, поток опять блокируется условной переменной. Если же условие выполняется, поток снимает взаимоисключающую блокировку и выполняется дальше.

35) Системные вызовы pthread_cond_init, pthread_cond_signal и pthread_cond_timedwait. Их предназначение и параметры.

int pthread_cond_init(pthread_cond_t *cond,

pthread_condattr_t *cond_attr);

Инициализирует условную переменную.

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);

Блокирует поток на условной переменной, на определенное время.

int pthread_cond_signal(pthread_cond_t *cond);

Разблокирует поток, ожидающий условную переменную.

36) Системные вызовы pthread_cond_broadcast, pthread_cond_wait и pthread_cond_destroy. Их предназначение и параметры.

int pthread_cond_wait(pthread_cond_t *cond,

pthread_mutex_t *mutex);

Блокирует поток на условной переменной.

int pthread_cond_broadcast(pthread_cond_t *cond);

Разблокирует все потоки, ожидающие условную переменную.

int pthread_cond_destroy(pthread_cond_t *cond);

Удаление объекта – условная переменная.

37) Семафоры POSIX.1b отличаются следующим:

• Семафоры POSIX.1b обозначаются путевым UNUX - именем (если создаются с помощью sem_open), либо остаются безымянными (но с присвоением начального виртуального адреса, если они создаются посредством вызова функции sem_init).

• В POSIX.1b с каждым вызовом sem_open и sem_init создается один семафор, а не набор семафоров.

• Значение семафора POSIX.1b увеличивается и уменьшается на единицу с каждым вызовом sem_post и sem_wait соответственно.

38) Системный вызов sem_open. Его предназначение и параметры.

sem_t sem_open(char*name, int flags, mode_t mode,

unsigned int value);

Функция sem_open создает семафор, имя которого задано аргументом name. Значение name должно быть строкой символов, похожей на путевое UNUX – имя, и всегда начинаться с символа «/». Кроме того, не следует ожидать, что будет создан файл с таким именем. Значение аргумента flags может быть равно нулю, если функции известно, что указанный семафор уже существует. Флаг O_CREAT показывает, что следует создать семафор с заданным именем. Вместе с этим флагом можно указывать флаг O_EXCL, который заставляет функцию возвращать код неудачного завершения, если семафор с заданным именем уже существует. Аргументы mode и init_value используются при создании нового семафора. Значение аргумента mode - это права доступа на чтение и запись для владельца, группы и прочих пользователей, которые должны быть установлены для нового семафора. Аргумент init_value задает значение, которое должно быть присвоено семафору. Тип этого аргумента - целое без знака.

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