
- •21. Виды программных единиц в современных ос
- •22. Программное порождение процессов в Unix
- •23. Программное порождение процессов в Windows
- •24. Программное уничтожение процессов
- •25. Ожидание завершения процессов
- •26. Иерархия процессов и ее использование
- •27. Понятие нити и связь ее с процессом
- •28. Создание нитей (thread) в программахWindows.
- •29. Создание posiXнитей в программе.
- •Int pthread_create(pthread_t* tid, const pthread_attr_t* att, void*(*fun)(void*), void* argp)
- •Int pthread_exit(void *status)
- •30. Уничтожение (отмена) нитей
- •Int pthread_setcancelstate(int state, int *oldstate),
- •Int pthread_setcanceltype(int type, int *oldtype),
- •31. Приостановка и повторный запуск нити.
- •32. Ожидание завершения нити
- •Int pthread_join(pthread_t tid, void** status).
- •33. Абстрактные критические секции.
- •34. Абстрактные двоичные семафоры.
- •35. Абстрактные семафоры с внутренним счетчиком.
- •36. Семафоры взаимоисключения в Windows.
- •37. Семафоры взаимоисключения в posix
- •Int pthread_mutex_lock(ptread_mutex_t* hmtx)
- •Int pthread_mutex_unlock(ptread_mutex_t* hmtx)
- •Int pthread_mutex_init( ptread_mutex_t *hmtx, ptread_mutexattr_*pattr)
- •38. Семафоры событий.
- •39. Средства множественных ожиданий
- •40. Программные семафоры с внутренним счетчиком в Windows.
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 – проверить, не было ли ожидания.