QNX/UNIX: Анатомия параллелизма
Шрифт:
• не инициализированы переменные, на которые указывают
• попытка использования переменной, на которую указывает
• вызвавший поток не владеет указанным мьютексом.
Поведение функции идентично варианту обычного ожидания, за исключением того, что ожидание может завершиться
Следует помнить, что после наступления времени тайм-аута управление совсем не обязательно вернется к вызвавшему потоку. После наступления этого времени функция переведет поток из состояния блокирования на условной переменной в состояние готовности и предпримет попытку захвата мьютекса. Если мьютекс в это время захвачен другим потоком, вызвавший поток перейдет в состояние блокирования на мьютексе.
Возвращаемые значения:
• не инициализированы переменные, на которые указывают
• попытка использования переменной, на которую указывает
• вызвавший поток не владеет указанным мьютексом.
Выполнение условия
Штатным способом разблокирования потока, блокированного на условной переменной, является вызов функции, сигнализирующей о выполнении условия. В native API это функция
Однако необходимо помнить про специфику ожидания внутри критической секции: вызов функции
Нештатным способом завершения ожидания на условной переменной может быть приход немаскированного сигнала UNIX. Если для данного сигнала определен обработчик, он выполнится без захвата мьютекса, а попытка захвата будет произведена уже после его завершения.
Функция переводит в состояние готовности самый приоритетный поток из блокированных на условной переменной
Возвращаемые значения:
Вызов функции разблокирует все потоки, блокированные на условной переменной
Возвращаемые значения:
Разрушение условной переменной
Вызов функции деинициализирует условную переменную
Возвращаемые значения:
Ждущая блокировка
QNX предоставляет упрощенный вариант использования условной переменной для блокирования (остановки) потока при помощи интерфейса так называемой ждущей блокировки( sleepon). Для использования этого механизма не нужно явно создавать никаких объектов синхронизации, за вас это делает ОС. Внешне ждущие блокировки выглядят как набор функций ожидания и освобождения, при этом последовательность действий в принципе аналогична использованию мьютексов и условных переменных.
За этим интерфейсом на самом деле скрывается один мьютекс и несколько дополнительных условных переменных. Использование функций ожидания должно проходить внутри участка кода, отмеченного вызовами блокирования и разблокирования мьютекса, ассоциированного со ждущей блокировкой. Одним из основных недостатков ждущей блокировки является то, что для всех потоков и всех ключей ожидания используется один общий мьютекс. ОС не может никоим образом отслеживать взаимные блокировки потоков при использовании ждущих блокировок. В целом поведение этого средства синхронизации идентично бинарным семафорам, но оно требует дополнительных операций блокирования мьютекса.
Все функции для работы со ждущими блокировками объявлены в файле
Операции со ждущей блокировкой
Захват и освобождение ждущей блокировки
Вызов функций ожидания может производиться только внутри блока захвата и освобождения ждущей блокировки: