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

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

Жанры

Параллельное и распределенное программирование на С++
Шрифт:

pthread_cond_wait(mutex, cond):

value = cond->value; /* 1 */

pthread_mutex_unlock (mutex); /* 2 */

pthread_mutex_lock (cond->mutex); /* 10 */

if (value == cond->value) { /* 11 */

me->next_cond = cond->waiter;

cond->waiter = me;

pthread_mutex_unlock(cond->mutex);

unable_to_run (me);

} else

pthread_mutex_unlock (cond->mutex); /* 12 */

pthread_mutex_lock (mutex); /* 13 * /

pthread_cond_signal (cond):

pthread_mutex_lock (cond->mutex); /* 3 */

cond->value++; /* 4 */

if (cond->waiter) { /* 5 */

sleeper = cond->waiter; /* 6 */

cond->waiter = sleeper->next_cond; /* 7 */

able_to_run (sleeper); /* 8 */

}

pthread_mutex_unlock (cond->mutex); /* 9 */

Итак,

в результате одного обращения к функции pthread_cond_signal сразу несколько потоков могут вернуться из вызова функции pthread_cond_wait или pthread_cond_timedwait . Такой эффект называется «фиктивным запуском». Обратите внимание на то, что подобная ситуация является самокорректирующейся благодаря тому, что количество потоков, «пробуждающихся» таким путем, ограничено; например, следующий поток, который вызывает функцию pthread_cond_wait , после определенной последовательности событий блокируется.

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

В разрешении «фиктивных запусков» есть одно дополнительное преимущество: знал о них, разработчикам приложений придется прелусмотреть цикл тестирования предиката при ожидании наступления нужного условия. Это также вынудит приложение «терпеливо» отнестись к распространению «лишних» условных сигналов, связанных с одной и той же условной переменной, формирование которых может быть закодировано в какой-то другой части приложения. В результате приложения станут более устойчивыми. Поэтому в стандарте IEEE Std 1003.1-2001 в прямой форме отмечена возможность возникновения «фиктивных запусков».

Будущие направления

Отсутствуют.

Смотри также

pthread_cond_destroy , pthread_cond_timedwait , том Base Definitions cтaндapтa IEEEStd 1003.1-2001, <pthread.h>.

Последовательность внесения изменений

Функции впервые реализованы в выпуске Issue 5. Включены для согласования с расширение м POSIX Threads Extension.

Issue 6

Функции pthread_cond_broadcast и pthread_cond_signal от м ечены как часть опции Threads.

Добавлен раздел «Замечания по использованию» (APPLICATION USAGE).

pthread_cond_destroy, pthread_cond_init

Имя

pthread_cond_destroy, pthread_cond_init

Синопсис

THR

#include <pthread.h>

int pthread_cond_destroy (pthread_cond_t *cond);

int pthread_cond_init (

pthread_cond_t *restrict cond,

const pthread_condattr_t *restrict attr);

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

Описание

Функция pthread_cond_destroy используется для разрушения условной пере м енной, заданной пара м етро м cond, в результате чего объект становится неинициализированны м. В конкретной реализации функция pthread_cond_destroy м ожет устанавливать объект, адресуемый параметром cond, равны м недействительно м у значению. Разрушенный

объект условной пере м енной м ожно снова инициализировать с по м ощью функции pthread_cond_init ; результаты ссылки на этот объект после его разрушения не определены.

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

Функция pthread_cond_init используется для инициализации условной пере м енной, адресуе м ой пара м етро м cond, объекто м атрибутов, адресуе м ы м пара м етро м attr. Если пара м етр attr со д ержит значение NULL, для инициализации применяются атрибуты условной переменной, действующие по умолчанию, т.е. результат в этом случае равносилен передаче адреса объекта, содержащего стандартные атрибуты условной пере м енной. После успешной инициализации Условная Переменная становится инициализированной.

Для осуществления синхронизации используется только сама условная переменная cond. Результат ссылки на копии пере м енной cond в обращениях к функциям pthread_cond_wait, pthread_cond_timedwait, pthread_cond_signal, pthread_cond_broadcast и pthread_cond_destroy неопределен. Попытка инициализировать уже инициализированную условную переменную приведет к неопределенному поведению.

Если атрибуты условной переменной, действующие по умолчанию, заранее определены, для инициализации условных переменных, которые создаются статически, можно использовать макрос PTHREAD_COND_INITIALIZER. Результат в это м случае эквивалентен дина м ической инициализации путе м вызова функции pthread_cond_init с пара м етро м attr, равны м значению NULL, но без проверки на наличие ошибок.

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

При успешно м завершении функции pthread_cond_destroy и pthread_cond_init возвращают нулевое значение; в противно м случае— код ошибки, обозначающий ее характер.

Проверка на наличие ошибок с кодами [EBUSY] и [EINVAL] реализована так (если реализована вообще), как будто она выполняется в самом начале работы каждой функции, и код ошибки в случае ее обнаружения возвращается до модификации состояния условной переменной, заданной параметром cond.

Ошибки

Функция pthread_cond_destroy может завершиться неудачно, если:

[EBUSY] реализация обнаружила попытку разрушить объект, адресуемый параметром cond, который относится к другому потоку (например, при использовании в функциях pthread_cond_wait или pthread_cond_timedwait );

[EINVAL] значение, заданное пара м етро м cond, недействительно.

Функция pthread_cond_init завершится неудачно, если:

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

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

Яманов Александр
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