Чтение онлайн

на главную - закладки

Жанры

QNX/UNIX: Анатомия параллелизма
Шрифт:

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
.

Не следует использовать условную переменную с мьютексом, у которого разрешен рекурсивный захват.

Возвращаемые значения:

EOK
— успешное завершение ожидания либо ожидание прервано сигналом;

EAGAIN
— недостаток системных ресурсов для реализации ожидания на условной переменной;

EFAULT
— произошла ошибка при попытке обращения к указателям
cond
или
mutex;

EINVAL
возвращается в следующих ситуациях:

• не инициализированы переменные, на которые указывают

cond
или
mutex;

• попытка использования переменной, на которую указывает

cond
, для нескольких мьютексов;

• вызвавший поток не владеет указанным мьютексом.

Ожидание с тайм-аутом

#include <time.h>

int pthread_cond_timedwait(pthread_cond_t* cond,

pthread_mutex_t* mutex, const struct timespec* abstime);

Поведение функции идентично варианту обычного ожидания, за исключением того, что ожидание может завершиться также при наступлении времени, переданного параметром

abstime
.

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

Возвращаемые значения:

EOK
— успешное завершение ожидания либо ожидание прервано сигналом;

EAGAIN
— недостаток системных ресурсов для реализации ожидания на условной переменной;

EFAULT
— произошла ошибка при попытке обращения к указателям
cond
или
mutex
;

EINVAL
— возвращается в следующих ситуациях:

• не инициализированы переменные, на которые указывают

cond
или
mutex
;

• попытка использования переменной, на которую указывает

cond
, для нескольких мьютексов;

• вызвавший поток не владеет указанным мьютексом.

ETIMEDOUT
— завершение функции по наступлению времени, указанного в
abstime.

Выполнение условия

Штатным способом разблокирования потока, блокированного на условной переменной, является вызов функции, сигнализирующей о выполнении условия. В native API это функция

SyncCondvarSignal
, которая имеет две POSIX-обертки:
pthread_cond_signal
и
pthread_cond_broadcast
. Разница между ними заключается в том, что первая пробуждает только один, самый приоритетный поток из ждущих выполнения условия, а вторая пробуждает все потоки, ожидающие выполнения условия.

Однако необходимо помнить про специфику ожидания внутри критической секции: вызов функции

pthread_cond_broadcast
только переведет ожидающие потоки из состояния блокирования на условной переменной в состояние блокировки на мьютексе, поскольку мьютекс сможет захватить только самый приоритетный поток.

Нештатным способом завершения ожидания на условной переменной может быть приход немаскированного сигнала UNIX. Если для данного сигнала определен обработчик, он выполнится без захвата мьютекса, а попытка захвата будет произведена уже после его завершения.

Поделиться:
Популярные книги

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4