Студопедия

КАТЕГОРИИ:


Архитектура-(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_mutexattr_settype(

pthread_mutexattr_t [2] attr, int type); int pthread_mutexattr_gettype(

const pthread_mutexattr_t [3] attr, int [4] type);

В версиях QNX 6.2.1 и 6.3 предусматривается создание мьютексов следующих типов:

PTHREAD_MUTEX_NORMAL - для этого типа не проводится контроль «мертвой блокировки» (deadlock) в ситуации, когда поток, захвативший мьютекс, пытается захватить его повторно. Поэтому при попытке повторного захвата такого мьютекса тем же потоком этот поток будет безусловно блокирован (то есть он попадает в «мертвую блокировку», а это во всех случаях аварийная ситуация в выполнении приложения); такой мьютекс уже некому разблокировать (мьютекс может разблокироваться только своим владельцем). Попытка освободить (unlock) мьютекс такого типа, захваченный другим потоком, или освободить незахваченный мютекс ни к чему не приводит, при этом не возвращается ошибка выполнения.

PTHREAD_MUTEX_ERRORCHECK - включается контроль ошибок. В этом режиме регистрируются следующие ситуации:

попытка повторного захвата мьютекса тем же потоком;

попытка освобождения мьютекса, захваченного другим потоком;

освобождение свободного мьютекса.

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

Примечание

Обратите внимание, что разрешение рекурсивного захвата мьютекса необходимо проводить установкой двух параметров (type и recursive).

int pthread_mutexattr_destroy(pthread_mutexattr_t [5] attr); Вызов разрушает ранее применявшийся объект - атрибутную запись мьютекса, после чего она уже не может более использоваться для инициализации мьютекса без предварительного выполнения вызова

pthread_mutexattr_init().

На этом обсуждение атрибутов заканчивается, и мы переходим непосредственно к функциям работы с мьютексом.

int pthread_mutex_init(pthread_mutex„t [6] mutex,

const pthread_mutexattr_t [7] attr);

Структура данных pthread_mutex_t определена в файле <pthread. h> (производный тип от типа sync_t, который в свою очередь определен в файле <target_nto. h>) и имеет следующий вид:

struct _sync_t {

/* Счетчик для рекурсивного мьютекса или семафора */

int count;

/* TID потока - имеет смысл и применяется только для мьютексов */

unsigned owner; }

 

Функция pthread_mutex_init() инициализирует переданный объект мьютекс в соответствии со значением переданных атрибутов. Если вместо attr передать NULL, то мьютекс будет создан в соответствии со значениями атрибутов по умолчанию. В native QNX API эта функция реализуется вызовом SyncTypeCreate(). SyncTypeCreate() - единая функция для создания всех базовых объектов синхронизации QNX Neutrino. Вместо прямого вызова функции pthread_mutex_init() для начальной инициализации статических мьютексов (глобальных на уровне файла кода или пространства имен namespase либо явно описанных с квалификатором static) можно воспользоваться двумя макросами PTHRE-AD_MUTEX_INITIALIZER и PTHREADJWUTEX.INITIALIZER:

pthread_nutex_t mutex = PTHREAD_MUTEX_INITIALI2ER;

pthread_mutex_t mutex - PTHREA0_RMUTEX_INITIALI2ER;

Первый из них создает мьютекс в соответствии со значениями атрибутов по умолчанию, а второй - мьютекс с разрешенным рекурсивным захватом.




Поделиться с друзьями:


Дата добавления: 2014-12-10; Просмотров: 683; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.