Инициализация мьютекса

Инициализация мьютекса

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;

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

5.2.4 Инициализация

Из книги C++ автора Хилл Мюррей

5.2.4 Инициализация Использование для обеспечения инициализации объекта класса функций вроде set_date() (установить дату) неэлегантно и чревато ошибками. Поскольку нигде не утверждается, что обект должен быть инициализирован, то программист может забыть это сделать, или (что


6.6 Присваивание и Инициализация

Из книги Справочное руководство по C++ автора Страустрап Бьярн

6.6 Присваивание и Инициализация Рассмотрим очень простой класс строк string:struct string (* char* p; int size; // размер вектора, на который указывает pstring(int sz) (* p = new char[size=sz]; *) ~string() (* delete p; *) *);Строка – это структура данных, состоящая из вектора сиволов и длины этого вектора. Вектор


R.12.6 Инициализация

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

R.12.6 Инициализация Объект класса без конструкторов, без частных или защищенных членов, без виртуальных функций и без базовых классов можно инициализировать с помощью списка инициализаторов (§R.8.4.1). Объект класса с конструктором должен инициализироваться или иметь


Шаг 12 - Двухэтапная инициализация.

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Шаг 12 - Двухэтапная инициализация. Когда мы создаем нестековый экземпляр, то пишем такой код:CClass* cc = new CClass();Попробуем поразбираться. new - это глобальный оператор с определением:void* operator new (size_t bytes);Он получает от компилятора количество байт, необходимое для хранения объекта,


8.9.1 Инициализация RIP

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

8.9.1 Инициализация RIP При запуске каждый маршрутизатор должен знать только о сети, к которой он подключен. Маршрутизатор RIP отправляет эти сведения широковещательной рассылкой на все соседние с ним в локальной сети маршрутизаторы. Кроме того, эти же сведения посылаются


Инициализация

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Инициализация На этапе инициализации в зависимости от входных параметров устанавливаются переменные состояния, необходимые для валидации пути сертификации [70]. В переменных состояния сохраняются различные ограничения, учитываемые при валидации пути. Переменные


Инициализация

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Инициализация Переменной в объявлении может быть присвоено начальное значение посредством инициализатора. Записи инициализатора в объявлении предшествует знак равенства=<инициализатор>Можно инициализировать переменные любого типа. Функции не инициализируются.


Параметры мьютекса

Из книги автора

Параметры мьютекса Параметры мьютекса хранятся в структуре 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() или


Инициализация структуры

Из книги автора

Инициализация структуры      Мы видели, как инициализируются переменные и массивы: int count = 0;static int fibo[ ]={0, 1, 1, 2, 3, 5, 8};Можно ли инициализировать и структурную переменную? Да, если структурная переменная будет внешней или статической. Здесь следует иметь в виду, что


5.2.2. Инициализация семафоров

Из книги автора

5.2.2. Инициализация семафоров Выделение и инициализация семафора — две разные операции. Чтобы проинициализировать семафор, вызовите функцию semctl(), задав второй аргумент равным нулю, а третий аргумент — равным константе SETALL. Четвертый аргумент должен иметь тип union semun, поле