КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Операции с граничным приоритетом
Большинство параметров мьютекса не могут быть изменены после его создания. Но не все. В процессе работы с мьютексом может быть изменено значение приоритета, которое система использует для реализации протокола граничного приоритета с целью предотвращения инверсии приоритетов: int pthread_mutex_setprioceiling(pthread_mutex_t* mutex, int prioceiling, int* old_ceiling); int pthread_mutex_getprioceiling(const pthread_mutex_t* mutex, int* prioceiling); Функция pthread_mutex_setprioceiling() захватывает мьютекс (или блокируется, пока мьютекс не будет освобожден, и уже тогда захватывает его) и изменяет установленную для него величину граничного приоритета, после чего освобождает мьютекс для использования другими потоками. После изменения значения граничного приоритета предыдущее значение возвращается в old_ceiling. Функция возвращает следующие значения: ЕОК - успешное завершение; EINVAL - указанный в вызове мьютекс не существует или указанный приоритет выходит за диапазон допустимых значений; EPERM - поток, вызвавший функцию, не имеет прав на изменение граничного приоритета указанного мьютекса. Захват мьютекса Захват мьютекса может производиться тремя разными функциями, в основе которых лежит функция из native QNX API SyncMutexLock(). Простой захват int pthread_mutex_lock(pthread_mutex_t* mutex); Функция захватывает мьютекс, на который ссылается mutex. Если мьютекс уже захвачен другим потоком, то вызвавший поток блокируется до освобождения мьютекса и после этого захватывает его. Только после этого функция pthread_mutex_lock() возвращает управление. Если захватить мьютекс пытается поток, который им уже владеет, то поведение функции pth read_mutex_lock() будет зависеть от значений атрибутов мьютекса, указанных при его создании. QNX предоставляет возможность рекурсивного захвата мьютекса при соответствующих настройках атрибутов (см. выше раздел «Параметры мьютекса»). При создании мьютекса с параметрами по умолчанию попытка повторного захвата мьютекса ни к чему не приводит. Если включен режим контроля ошибок и отключен рекурсивный захват мьютекса, функция pthread_mutex_lock() возвращает EDEADLK при попытке повторного захвата мьютекса тем же потоком. Функция pthread_mutex_lock() может возвращать следующие значения: ЕОК - успешное завершение; EAGAIN - недостаточно системных ресурсов для захвата мьютекса; EDEADLK - вызывающий поток уже владеет мьютексом и мьютекс не поддерживает рекурсивный захват (режим контроля ошибок); EINVAL - некорректное значение параметра mutex. Попытка захвата int pthreadjnutex_trylock(pthread„mutex_t* mutex); Функция проверяет, свободен ли мьютекс mutex, и если да, то она захватывает его. В противном случае функция возвращает значение EBUSY. Возвращаемые значения: ЕОК - успешное завершение; EAGAIN - недостаточно системных ресурсов для захвата мьютекса; ЕВUSY - мьютекс mutex уже захвачен;..., EINVAL - некорректное значение параметра mutex. Захват с установкой времени ожидания Sinclude <pthread.h>" #include <time.h> int pthreadjnutex_timedlock(pthread_mutex_t* mutex, const struct timespec* abs_timeout); Функция проверяет, свободен ли мьютекс (mutex), и если да, то поток, в котором вызвана функция, захватывает этот мьютекс. Если мьютекс уже захвачен, вызвавший поток блокируется до освобождения мьютекса либо до наступления времени, указанного в аргументе abs_timeout. Если это время уже наступило, поток не блокируется вообще, но захват все-таки произойдет, если мьютекс свободен. Наступление времени определяется по часам REALTIME_CL0CK, когда значение часов оказывается равным или большим значения, указанного в abs_timeout. Тип данных timespec определен в файле <time. h>. Если мьютекс создан с атрибутом протокола PRIO_INHERIT, то после выхода потока из блокировки на мьютексе по тайм-ауту приоритет владельца мьютекса подвергается пересмотру в соответствии с приоритетами потоков, оставшихся в очереди на захват мьютекса. Возвращаемые значения: ЕОК - успешное завершение; ['AGAIN - недостаточно системных ресурсов для захвата мьютекса; EDEADLK — вызывающий поток уже владеет мьютексом, который не поддерживает рекурсивный захват (режим контроля ошибок); EINVAL - мьютекс использует протокол граничного приоритета для предотвращения инверсии (атрибут protocol установлен в значение PTHRE-AD_PRI0_PR0TECT), но приоритет вызвавшего потока выше граничного приоритета, присвоенного мьютексу; поток должен быть блокирован (мьютекс не свободен), а значение поля abs_timeout, показывающее количество наносекунд, меньше нуля или больше 1000 миллионов; переменная, на которую указывает mutex, не является инициированным объектом - мьютексом. ETIMEDOUT - мьютекс не может быть захвачен, поскольку указанный тайм-аут истек. Освобождение мьютекса int pthread_mutex_unlock(pthread_mutex_t* mutex); Функция pthread_mutex_unlock() освобождает мьютекс, на который ссылается переменная mutex. Вызвавший поток должен быть владельцем мьютекса. Если есть потоки, блокированные в ожидании освобождения мьютекса, то поток с наивысшим приоритетом (или при равных приоритетах дольше всех ждавший) выходит из блокированного состояния и становится владельцем мьютекса. Для мьютексов, разрешающих рекурсивный захват, функция освобождения должна вызываться столько же раз, сколько и функция захвата. Возвращаемые значения: ЕОК - успешное завершение; EINVAL - переменная, на которую указывает mutex, не является инициированным объектом — мьютексом; EPERM - вызвавший поток не является владельцем мьютекса. Разрушение объекта мьютекс int pthread_mutex_destroy(pthread_mutex_t* mutex); Вызов разрушает объект мьютекс, на который указывает переменная mutex. После чего эта переменная не может быть использована без предварительного вызова pthread_mutex_init(). Возвращаемые значения: ЕОК - успешное завершение; EBUSY- мьютекс захвачен и не может быть разрушен до освобождения; EINVAL - переменная, на которую указывает mutex, не является инициированным объектом - мьютексом.
Дата добавления: 2014-12-10; Просмотров: 430; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |