Захват мьютекса
Захват мьютекса
Захват мьютекса может производиться тремя разными функциями, в основе которых лежит функция из native QNX API SyncMutexLock().
Простой захват
int pthread_mutex_lock(pthread_mutex_t* mutex);
Функция захватывает мьютекс, на который ссылается mutex. Если мьютекс уже захвачен другим потоком, то вызвавший поток блокируется до освобождения мьютекса и после этого захватывает его. Только после этого функция pthread_mutex_lock() возвращает управление. Если захватить мьютекс пытается поток, который им уже владеет, то поведение функции pthread_mutex_lock() будет зависеть от значений атрибутов мьютекса, указанных при его создании. QNX предоставляет возможность рекурсивного захвата мьютекса при соответствующих настройках атрибутов (см. выше раздел «Параметры мьютекса»). При создании мьютекса с параметрами по умолчанию попытка повторного захвата мьютекса ни к чему не приводит. Если включен режим контроля ошибок и отключен рекурсивный захват мьютекса, функция pthread_mutex_lock() возвращает EDEADLK при попытке повторного захвата мьютекса тем же потоком.
Функция pthread_mutex_lock() может возвращать следующие значения: EOK — успешное завершение;
EAGAIN — недостаточно системных ресурсов для захвата мьютекса;
EDEADLK — вызывающий поток уже владеет мьютексом и мьютекс не поддерживает рекурсивный захват (режим контроля ошибок);
EINVAL — некорректное значение параметра mutex.
Попытка захвата
int pthread_mutex_trylock(pthread_mutex_t* mutex);
Функция проверяет, свободен ли мьютекс mutex, и если да, то она захватывает его. В противном случае функция возвращает значение EBUSY.
Возвращаемые значения:
EOK — успешное завершение;
EAGAIN — недостаточно системных ресурсов для захвата мьютекса;
EBUSY — мьютекс mutex уже захвачен;
EINVAL — некорректное значение параметра mutex.
Захват с установкой времени ожидания
#include <pthread.h>
#include <time.h>
int pthread_mutex_timedlock(pthread_mutex_t* mutex,
const struct timespec* abs_timeout);
Функция проверяет, свободен ли мьютекс (mutex), и если да, то поток, в котором вызвана функция, захватывает этот мьютекс. Если мьютекс уже захвачен, вызвавший поток блокируется до освобождения мьютекса либо до наступления времени, указанного в аргументе abs_timeout. Если это время уже наступило, поток не блокируется вообще, но захват все-таки произойдет, если мьютекс свободен.
Наступление времени определяется по часам REALTIME_CLOCK, когда значение часов оказывается равным или большим значения, указанного в abs_timeout. Тип данных timespec определен в файле <time.h>.
Если мьютекс создан с атрибутом протокола PRIO_INHERIT, то после выхода потока из блокировки на мьютексе по тайм-ауту приоритет владельца мьютекса подвергается пересмотру в соответствии с приоритетами потоков, оставшихся в очереди на захват мьютекса.
Возвращаемые значения:
EOK — успешное завершение;
EAGAIN — недостаточно системных ресурсов для захвата мьютекса;
EDEADLK — вызывающий поток уже владеет мьютексом, который не поддерживает рекурсивный захват (режим контроля ошибок);
EINVAL — мьютекс использует протокол граничного приоритета для предотвращения инверсии (атрибут protocol установлен в значение PTHREAD_PRIO_PROTECT), но приоритет вызвавшего потока выше граничного приоритета, присвоенного мьютексу; поток должен быть блокирован (мьютекс не свободен), а значение поля abs_timeout, показывающее количество наносекунд, меньше нуля или больше 1000 миллионов; переменная, на которую указывает mutex, не является инициированным объектом — мьютексом.
ETIMEDOUT — мьютекс не может быть захвачен, поскольку указанный тайм-аут истек.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Параметры мьютекса
Параметры мьютекса Параметры мьютекса хранятся в структуре pthread_mutexattr_t, которая определена типом sync_attr_t. Эта структура должна быть, создана и определена до инициализации мьютекса, после чего может быть переопределена и использована для других объектов типа
Определение типа мьютекса
Определение типа мьютекса int pthread_mutexattr_settype( pthread_mutexattr_t* attr, int type);int pthread_mutexattr_gettype( const pthread_mutexattr_t* attr, int* type);В версиях QNX 6.2.1 и 6.3 предусматривается создание мьютексов следующих типов:• PTHREAD_MUTEX_NORMAL — для этого типа не проводится контроль «мертвой блокировки» (deadlock) в
Инициализация мьютекса
Инициализация мьютекса int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr);Структура данных pthread_mutex_t определена в файле <pthread.h> (производный тип от типа sync_t, который в свою очередь определен в файле <target_nto.h>) и имеет следующий вид:struct _sync_t { /* Счетчик для рекурсивного
Освобождение мьютекса
Освобождение мьютекса int pthread_mutex_unlock(pthread_mutex_t* mutex);Функция pthread_mutex_unlock() освобождает мьютекс, на который ссылается переменная mutex. Вызвавший поток должен быть владельцем мьютекса. Если есть потоки, блокированные в ожидании освобождения мьютекса, то поток с наивысшим
Пример применения мьютекса
Пример применения мьютекса Модернизируем наш пример из раздела, посвященного использованию семафора для случая множества потоков источников и приемников данных. Проблема заключается в том, что когда несколько потоков одновременно попытаются вызвать функцию push() или
Захват рынка
Захват рынка В 1909 г. по указанию Моргана и с помощью его денег Вейл завладел контрольным пакетом акций Western Union — компании, которая так мучила Bell раньше. Таким образом, он стал президентом обеих компаний. AT&T теперь контролировала все каналы междугородней мгновенной
Захват отдельного видеофрагмента
Захват отдельного видеофрагмента Захват отдельного видеофрагмента может осуществляться двумя способами. В первом случае вы визуально наблюдаете за ходом воспроизведения видео, нужно только включить и выключить режим захвата в нужный момент. Сделайте следующее.1.
Функция Snap (Захват)
Функция Snap (Захват) В процессе перемещения клипов на видеодорожке необходимо точно подогнать их границы друг к другу, чтобы не образовалось пустого пространства. До сих пор клипы хорошо «стыковались» друг с другом. Это происходило благодаря функции Snap (Захват),
Захват и редактирование видео
Захват и редактирование видео Еще в начале века для Linux практически не существовало удобных и стабильно работающих приложений, позволяющих захватывать и редактировать видео. Сегодня ситуация изменилась. Для этой системы есть и нелинейные видеоредакторы, которые
Глава 2 Захват
Глава 2 Захват • Режим захвата• Цифровой захват• Аналоговый захват• Импорт видео с DVD• Импорт мультимедиаЗахватом (англ. capture) называется процесс переноса видео с цифрового или аналогового устройства на компьютер. При захвате видео с аналогового устройства
Цифровой захват
Цифровой захват Захват с цифрового устройства, будь то камера или проигрыватель, по сути представляет собой перенос файла с носителя цифрового устройства (например, ленты камеры) в компьютер. Никаких настроек видеоизображения (яркость, контраст и т. д.) и сопутствующего
Захват
Захват В этом подразделе приводится перечень действий, выполняемых при захвате из цифрового источника. Предполагается, что вы уже перевели Pinnacle Studio в режим Захват, выбрали жесткий диск для захваченного видео, в качестве источника задали DV-камеру или подобное устройство,
Аналоговый захват
Аналоговый захват Кроме захвата цифрового видео Studio можно использовать также для захвата видео из аналоговых источников при наличии, естественно, соответствующего оборудования. В качестве источников видео (и звука) при аналоговом захвате выступают следующие
Захват
Захват Перед тем как приступать непосредственно к захвату, убедитесь, что аналоговый выход источника подключен к устройству захвата, включено питание, а также выполнены следующие настройки:• в качестве источника видео задано устройство захвата;• выбран формат захвата;
«Захват» звука
«Захват» звука В этом разделе мы познакомимся с тем, как записать звуковой сигнал. Это может быть старая магнитофонная запись, которую вы хотите сохранить, виниловая пластинка из музыкальной коллекции, ваш родной голос. Сюда же отнесем извлечение аудиоданных с
Захват изображения
Захват изображения Функция Захват изображения позволяет пользователю вставить на слайды презентации любые снимки экрана. Есть возможность вставить все содержимое экрана, снимок активного окна или фрагмент произвольной формы.Данная функция может быть полезна в