Все функции операций над условной переменной и ее атрибутами реализованы в заголовочном файле . Если для вызова функции необходимы дополнительные заголовочные файлы, это будет указано особо.
Операции над условной переменной
Параметры условной переменной
Инициализация параметров
int pthread_condattr_init(pthread_condattr_t* attr);
Функция инициализирует структуру атрибутов условной переменной, на которую указывает параметр attr
. Структура данных pthread_condattr_t
определена в файле и является производной от типа syncattr_t
, описанного в разделе «Параметры мьютекса». При инициализации атрибуты устанавливаются в значения по умолчанию.
Возвращаемые значения:
EOK
— успешное завершение;
ENOMEM
— недостаточно памяти для инициализации атрибутов условной переменной attr
.
Для условной переменной возможна модификация значительно меньшего числа параметров, чем для мьютекса. Следующие функции описывают доступ к этим параметрам.
Параметр доступа
int pthread_condattr_setpshared(
pthread_condattr_t* attr, int pshared);
int pthread_condattr_getpshared(
const pthread_condattr_t* attr, int* pshared);
Функции устанавливают/считывают, возможен ли доступ к условной переменной из потоков, порожденных в других процессах. Параметр pshared
может принимать следующие значения:
• PTHREAD_PROCESS_SHARED
— любой поток, имеющий доступ к области памяти, в которой расположена условная переменная, может ее использовать.
• PTHREAD_PROCESS_PRIVATE
(значение по умолчанию) — только поток, созданный в контексте того же процесса, в котором находится условная переменная, может ее использовать. Если поток из другого процесса попытается использовать условную переменную, созданную с параметром PTHREAD_PROCESS_PRIVATE
, результат будет не определен.
Возвращаемые значения:
EOK
— успешное завершение;
EINVAL
— атрибуты условной переменной, на которые указывает attr
, или новое значение, на которое ссылается pshared
, не определены.
Параметры тайм-аута
int pthread_condattr_setclock(
pthread_condattr_t* attr, clockid_t id);
int pthread_condattr_getclock(
const pthread_condattr_t* attr, clockid_t* id);
Функции устанавливают/считывают, каким способом (т.e. на основании какого счетчика) вычисляется значение тайм-аута при вызовах pthread_cond_timedwait()
. Этот параметр в QNX Neutrino 6.2 не является обязательным и введен в соответствии со стандартом POSIX 1003.1j (draft). На практике можно устанавливать только значение REALTIME_CLOCK
в качестве параметра id;
это же значение является значением по умолчанию.
Возвращаемые значения:
EOK
— успешное завершение;
EINVAL
— неверный аргумент attr.
Разрушение блока параметров
int pthread_condattr_destroy(pthread_condattr_t* attr);
Функция разрушает блок параметров условной переменной, на которые указывает attr
, после чего он уже не может использоваться без повторной инициализации.
На практике разрушение параметров объекта синхронизации не имеет особого смысла. Вы всегда можете переопределить атрибуты, содержащиеся в переменной attr
, для инициализации других условных переменных.
Возвращаемые значения:
EOK
— успешное завершение;
EINVAL
— неверный аргумент attr.
Инициализация условной переменной
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_cond_init(pthread_cond_t* cond, pthread_condattr_t* attr);
Инициализирует условную переменную cond
со значениями, установленными атрибутами attr
. Вместо прямого вызова функции pthread_cond_init()
для начальной инициализации статических условных переменных (глобальных на уровне файла кода или пространства имен namespace
либо явно описанных с квалификатором static
) можно воспользоваться макросом PTHREAD_COND_INITIALIZER
.
Возвращаемые значения:
EOK
— успешное завершение;
EAGAIN
— нет свободных системных объектов синхронизации;
EBUSY
— переменная cond
уже инициализирована и не разрушалась;
EFAULT
— ошибка доступа ядра к объектам cond
или attr
;
EINVAL
— неправильное значение переменной cond
.
Простое ожидание
int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);
Вызов функции блокирует вызвавший поток на условной переменной cond
и разблокирует мьютекс mutex
. Поток блокируется до тех пор, пока другой поток не вызовет функцию разблокирования на условной переменной cond
( pthread_cond_signal()
или pthread_cond_broadcast()
). Мьютекс mutex
должен быть захвачен потоком до вызова функции. Поток, блокированный на условной переменной, может быть разблокирован также приходом сигнала или вызовом завершения потока. В любом случае при разблокировании потока и выходе из функции ожидания поток вновь захватывает мьютекс mutex
.
Читать дальше
Конец ознакомительного отрывка
Купить книгу