Составители:
26
продолжают исполнение. Мнемоническая схема барьера показана на рис.
2.3.
Аналогией из городской жизни является ситуация на конечной остановке мар-
шрутного такси. Строгий водитель-частник, подогнав микроавтобус, ждет, пока все
места будут заняты. Пассажиры недовольны, они спешат домой и по другим личным
делам, но вынуждены ждать полного заполнения маршрутного такси, поскольку оно
частное и правилам общественного транспорта не подчиняется. И водителю, и пасса-
жирам совершенно все равно, кто займет места, лишь бы это случилось как можно
быстрей. Только когда все места заняты, маршрутное такси трогается с места. В этой
аналогии число мест микроавтобуса соответствует счетчику барьера, а запросы wait –
ожиданиям пассажиров уже занявших места в микроавтобусе.
Объект барьер может быть создан вызовом:
int pthread_barrier_init(pthread_barrier_t *barrier, // указатель к барьеру
const pthread_barrierattr_t *attr, // атрибуты барьера
unsigned int count); // счетчик барьера.
Счетчик count определяет число потоков, которые должны вызывать
функцию int pthread_barrier_wait(pthread_barrier_t *barrier);
После создания барьера каждый поток будет вызывать эту функцию
для указания на завершение этапа вычислений. При вызове данной функ-
ции поток блокируется до тех пор, пока число блокированных потоков не
достигнет значения счетчика. После этого все потоки будут деблокированы.
Для обслуживания механизма синхронизации барьер используются сле-
дующие системные вызовы (табл. 2.4).
Таблица 2.4
Функция Описание
pthread_barrierattr_getpshared() Получить текущее значение атрибута разделения барьера
pthread_barrierattr_destroy() Уничтожить атрибутный объект барьера
pthread_barrierattr_init() Инициализировать атрибутный объект барьера
pthread_barrierattr_setpshared() Установить значение атрибута разделения барьера
pthread_barrier_destroy() Уничтожить барьер
pthread_barrier_init() Инициализировать барьер
pthread_barrier_wait() Синхронизировать поток с барьером
При создании барьера формируется указатель на объект атрибутов,
который далее должен быть инициализирован. Атрибут разделения барье-
ра может иметь 2 значения:
• PTHREAD_PROCESS_SHARED – разрешает барьеру синхронизи-
ровать потоки различных процессов;
• PTHREAD_PROCESS_PRIVATE (значение по умолчанию) – раз-
решает барьеру синхронизировать потоки в пределах одного процесса.
Страницы
- « первая
- ‹ предыдущая
- …
- 24
- 25
- 26
- 27
- 28
- …
- следующая ›
- последняя »
