Инициализация мьютекса
Инициализация мьютекса
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 count;
/* TID потока - имеет смысл и применяется только для мьютексов */
unsigned owner;
};
Функция pthread_mutex_init() инициализирует переданный объект мьютекс в соответствии со значением переданных атрибутов. Если вместо attr передать NULL, то мьютекс будет создан в соответствии со значениями атрибутов по умолчанию. В native QNX API эта функция реализуется вызовом SyncTypeCreate(). SyncTypeCreate() — единая функция для создания всех базовых объектов синхронизации QNX Neutrino.
Вместо прямого вызова функции pthread_mutex_init() для начальной инициализации статических мьютексов (глобальных на уровне файла кода или пространства имен namespace либо явно описанных с квалификатором static) можно воспользоваться двумя макросами PTHREAD_MUTEX_INITIALIZER и PTHREAD_RMUTEX_INITIALIZER:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_RMUTEX_INITIALIZER;
Первый из них создает мьютекс в соответствии со значениями атрибутов по умолчанию, а второй - мьютекс с разрешенным рекурсивным захватом.
Более 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) в
Захват мьютекса
Захват мьютекса Захват мьютекса может производиться тремя разными функциями, в основе которых лежит функция из native QNX API SyncMutexLock().Простой захватint pthread_mutex_lock(pthread_mutex_t* mutex);Функция захватывает мьютекс, на который ссылается mutex. Если мьютекс уже захвачен другим потоком, то
Освобождение мьютекса
Освобождение мьютекса int pthread_mutex_unlock(pthread_mutex_t* mutex);Функция pthread_mutex_unlock() освобождает мьютекс, на который ссылается переменная mutex. Вызвавший поток должен быть владельцем мьютекса. Если есть потоки, блокированные в ожидании освобождения мьютекса, то поток с наивысшим
Пример применения мьютекса
Пример применения мьютекса Модернизируем наш пример из раздела, посвященного использованию семафора для случая множества потоков источников и приемников данных. Проблема заключается в том, что когда несколько потоков одновременно попытаются вызвать функцию push() или
8.9.1 Инициализация RIP
8.9.1 Инициализация RIP При запуске каждый маршрутизатор должен знать только о сети, к которой он подключен. Маршрутизатор RIP отправляет эти сведения широковещательной рассылкой на все соседние с ним в локальной сети маршрутизаторы. Кроме того, эти же сведения посылаются
R.12.6 Инициализация
R.12.6 Инициализация Объект класса без конструкторов, без частных или защищенных членов, без виртуальных функций и без базовых классов можно инициализировать с помощью списка инициализаторов (§R.8.4.1). Объект класса с конструктором должен инициализироваться или иметь
Шаг 12 - Двухэтапная инициализация.
Шаг 12 - Двухэтапная инициализация. Когда мы создаем нестековый экземпляр, то пишем такой код:CClass* cc = new CClass();Попробуем поразбираться. new - это глобальный оператор с определением:void* operator new (size_t bytes);Он получает от компилятора количество байт, необходимое для хранения объекта,
Инициализация структуры
Инициализация структуры Мы видели, как инициализируются переменные и массивы: int count = 0;static int fibo[ ]={0, 1, 1, 2, 3, 5, 8};Можно ли инициализировать и структурную переменную? Да, если структурная переменная будет внешней или статической. Здесь следует иметь в виду, что
5.2.2. Инициализация семафоров
5.2.2. Инициализация семафоров Выделение и инициализация семафора — две разные операции. Чтобы проинициализировать семафор, вызовите функцию semctl(), задав второй аргумент равным нулю, а третий аргумент — равным константе SETALL. Четвертый аргумент должен иметь тип union semun, поле
Инициализация
Инициализация Переменной в объявлении может быть присвоено начальное значение посредством инициализатора. Записи инициализатора в объявлении предшествует знак равенства=<инициализатор>Можно инициализировать переменные любого типа. Функции не инициализируются.
5.2.4 Инициализация
5.2.4 Инициализация Использование для обеспечения инициализации объекта класса функций вроде set_date() (установить дату) неэлегантно и чревато ошибками. Поскольку нигде не утверждается, что обект должен быть инициализирован, то программист может забыть это сделать, или (что
6.6 Присваивание и Инициализация
6.6 Присваивание и Инициализация Рассмотрим очень простой класс строк string:struct string (* char* p; int size; // размер вектора, на который указывает pstring(int sz) (* p = new char[size=sz]; *) ~string() (* delete p; *) *);Строка – это структура данных, состоящая из вектора сиволов и длины этого вектора. Вектор
Инициализация
Инициализация На этапе инициализации в зависимости от входных параметров устанавливаются переменные состояния, необходимые для валидации пути сертификации [70]. В переменных состояния сохраняются различные ограничения, учитываемые при валидации пути. Переменные
Цилюрик Олег Иванович
Просмотр ограничен
Смотрите доступные для ознакомления главы 👉