Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен / Answers (20-40).docx
Скачиваний:
212
Добавлен:
15.06.2014
Размер:
38.2 Кб
Скачать

37. Семафоры взаимоисключения в posix

Запрос на владение сем-ром (операция P) в Unix:

Int pthread_mutex_lock(ptread_mutex_t* hmtx)

Для аналога операции V (отказ от владения сем-ром):

Int pthread_mutex_unlock(ptread_mutex_t* hmtx)

Для создания сем-ра:

Int pthread_mutex_init( ptread_mutex_t *hmtx, ptread_mutexattr_*pattr)

Т.к. в Unix нет ф-ий открытия доступа к mutex-семафору,созданному др процессом,то нет и ф-ии закрытия такого mutex-семафора. Для удаления из ОС mutex-сем-ра - после прекращения надобности в нем: int pthread_mutex_destroy( ptread_mutex_t* hmtx).

Ф-ия int pthread_mutex_trylock(ptread_mutex_t* hmtx) - не блокирует, а возвращает отличное от 0 значение, если семафор занят.

Все ф-ии описаны в заголовочном файле pthread.h. Во всех этих ф-иях 1 аргумент -указатель на хэндл сем-ра. В ф-ии инициализации 2 аргумент определяет атрибуты для нового mutex-сем-ра. Атрибуты могут задаваться с пом констант: USINC_PROCESS (сем-р может исп-ться др процессом), USINC_THREAD(сем-р может исп-ться нитями только в одном процессе).

В Linux семафоры взаимоисключения предоставляют дополнительные возможности. Они связаны с попытками нити захватить семафор, уже принадлежащий ей. Эти возможности называют типами mutex семафоров. Имеются три таких типа: быстрый семафор, рекурсивный семафор и контролирующий семафор. Попытка захвата быстрого семафора приводит к блокировке нити, но такая же попытка для рекурсивного семафора не приводит к блокировке. При этом для освобождения mutex семафора оказывается нужным выполнить вызов функции pthread_mutex_unlock() столько раз, сколько перед этим выполнялось вызовов функции pthread_mutex_lock().

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

38. Семафоры событий.

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

Wndows: Cоздает семафор событий:

CreateEvent(адрес атрибута защиты, BOOL ManualReset //переустановка состояния в nonsignaled, BOOL InitialState //состояние, если true то был сигнал о событии, имя семафора);

Запуск сигнала события: SetEvent(HANDLE hev);

ResetEvent – переустановить сост-е в nonsignaled («выкл» сигнал о событии).

В автономном режиме WaitForSingleObject(HANDLE hevsem, timeout); -ч/з некот-е время timeout Event-сем-р, созданный ф-ией CreateEvent,автоматически сбрасывается (освобождается). После вып-ния ф-ии WaitForSingleObject (по сигналу Event) пробуждается только одна из ожидающих нитей.

Unix: EventSem – “условные переменные”

pthread_cond_init(pthread_cond_t *cond //указатель на условную перем-ную, адрес атрибутов или NULL);

pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *htmx); - oжидание условной переменной.

pthread_cond_broadcast(pthread_cond_t *cond); - оповещение всех нитей.

рthread_cond_signal – выдача сигнала.

pthread_cond_destroy – уничтожение условной переменной.

pthread_cond_trywait – проверить, не было ли ожидания.

Соседние файлы в папке Экзамен