Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Нити исполнения (pthreads) в ОС UNIX. Мьютексы pthreads.




Thread поток или нить. В 95 был принят стандарт, описывающий функции управления pthreads, распространяются и на win и на unix. Thread не имеет собственного адресного пространства. Поток должен иметь главную функцию

Void *my_thread_main (void*arg) {…}

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

Создание и запуск потока

Int pthread_create (thread_t “th,pthread_attr_t” attr, void *(*start_routine)(void*)(void*arg).

Аргумент attr- специфические параметры работы нового потока, в большинстве случаев ставят нулевой указатель. Start_routine указывает на главные функции потока, эта функция будет запущена во вновь созданном потоке, причем на ввод ей будет передан указатель, который при организации create указывается в качестве параметра arg.Функция возвращает 0, в случае успеха, либо код ошибки. Для данной функции таким кодом мб значение EAGAIN, значит что для создания потока нехватило системных ресурсов. Поток может завершиться 2мя способами (вернуть управление из своей главной функции; завершить принудительно, вызвав функцию void pthread_exit (void*retval)

В первом случае результат- значение, возвращенное из главной функции, тип void*

Во втором случае -значение аргумента retval

Поток может дождаться завершения другого потока pthread_join(pthreads_t th,void*result) аргумент th задает идентификатор thread, завершения которго ждем, через параметр result передается адрес в который следует записать результат работы потока (похоже на wait pid). Результат завершения потока должен храниться, если его не вызовет join то он будет занимать системные ресурсы подобно зомби. Этого можно избежать , если перевести поток в отсоединенный режим int pthread_detach (pthreads_t th); их невозможно дождаться с помощью функции join, а значит нельзя проанализировать результат работы. Для detach и join 0-успех, либо код ошибки. Поток может узнать собственный идентификактор pthreads_t pthread_self.

Перевод потока в отсоединенный режим pthread_detach(pthreads_self());

Поток может досрочно завершить другой поток int pthread_cancel(pthreads_t th);

Результатом работы ph будет специальное значение PTHREAD_CANCELED, cancel не уничтожает поток, а отменяет его, что не всегда приводит к немедленному завершению потока. Возможно что поток завершится только дойдя до 1 из функций pthread, входящей в число точки обмена. Кроме основных действий проводит проверку на наличие запроса на отмену потока.

Мьютексы pthreads

В качестве mutex используется переменная pthread_mutex_t начальное значение соответствует состоянию mutex открыт, для этого следует проинициализировать переменную , сист знач pthreads_mutex_t my_mutex=PTHREAD_MUTEX_INITIALIZER открыт, представляет собой инициализ, т.е попытка подставить в mutex это значение может привести к ошибке при компиляции. Осн операции над mutex осуществляются с помощью функции

Int pthread_mutex_unlock(pthread_mutex_t)

Int pthread_mutex_lock(-//-) блокирующее закрытие с ожиданием

Int pthread_mutex_trylock(-//-) неблокир закрытие. Все функции возвращают в случае успеха, или код ошибки-неудача. Если trylock применяют к закрытому mutex она возвращает код ошибки EAGAIN.

Mutex уничтожен

Int pthread_destroy(-//-), высвободить системные ресурсы. Команда destroy формальна, в момент уничтожения mutex дб открыт.

POSIX- семафоры.

Семафоры изначально рассчитаны на работу нескольких процессов.В Unix можно использовать posix семафоры в рамках 1го полновесного процесса для взаимодействия потоков. В качестве семафора используется переменная типа sem_t Инициалу сем:

Int sem_unit(sem_t*sem, int pshared,unsigned Int volue);

Sem задает адрес инициализир семафора; shared указывает будет ли семафор доступен для других процессов, дб равен 0; volue- стартовые значения

int sem_post(sem_t * sem);Установка семафора (+1).

Int sem_wait(sem_t * sem);Ожидает ненулевого значения семафора. При вызове функции значение семафора уменьшается на единицу.

int sem_trywait(sem_t * sem);Неблокирующие ожидания ненулевого значения семафора.

В случае если семафор на момент вызова trywait имеет значение 0, функция возвращает ошибку EAGAIN. Можно программно определить текущее значение семафора Int sem_getvalue (sem_t*sem,int*sval)

Уничтожитель Int sem_destroy (sem_t*sem) не должно быть ни одного потока, находящегося в состоянии ожидания на семафоре.

 


Поделиться:

Дата добавления: 2015-01-14; просмотров: 155; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.005 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты