Вход/Регистрация
QNX/UNIX: Анатомия параллелизма
вернуться

Цилюрик Олег Иванович

Шрифт:

void* threadfunc(void* data) {

// все потоки после создания должны "застрять" на входном барьере,

// чтобы потом одновременно "сорваться" в исполнение...

pthread_barrier_wait(&bstart);

// ... выполнение ...

return NULL;

}

int main(int argc, char *argv[]) {

...

int N = ...; // будем создавать N идентичных потоков

if (pthread_barrier_init(&bstart, NULL, N) != EOK)

perror("barrier init"), exit(EXIT_FAILURE);

for (int i = 0; i < nthr; i++) {

if (pthread_create(NULL, NULL, threadfunc, NULL) != EOK)

perror("thread create"), exit(EXIT_FAILURE);

}

...

}

Обратите внимание на параметр количества ожидающих на барьере потоков при его инициализации: здесь он на единицу меньше.

Применение барьеров подробно описано в литературе [1], поэтому мы не будем специально останавливаться на этом элементе синхронизации, тем более что это один из наиболее простых в применении элементов.

По непонятным причинам документация QNX [8] причисляет барьеры к элементам синхронизации ядра, однако никаких средств native API QNX, предназначенных для работы с барьерами, документация не описывает, а заголовочный файл

<pthread.h>
так описывает тип
pthread_barrier_t
:

typedef struct {

unsigned int barrier;

unsigned int count;

pthread_mutex_t lock;

pthread_cond_t bcond;

} pthread_barrier_t;

Выводы можно сделать самостоятельно.

Также несколько загадочно выглядит тот факт, что согласно документации QNX 6.2.1 все функции работы с барьером и его атрибутами описаны в заголовочном файле

<pthread.h>
, за исключением двух функций
pthread_barrier_wait
и
pthread_barrierattr_setpshared
, о которых говорится, что они описаны в файле
<sync.h>
! Но если заглянуть в заголовочные файлы, то выясняется, что можно спокойно использовать для абсолютно всех функций работы с барьером либо заголовочный файл
<pthread.h>
, либо
<sync.h>
.

Операции с барьерами

Параметры барьера

Следующие функции инициализируют и разрушают блок параметров барьера:

int pthread_barrierattr_init(pthread_barrierattr_t* attr);

int pthread_barrierattr_destroy(pthread_barrierattr_t* attr);

Функция инициализации возвращает следующие значения:

EOK
— успешное выполнение;

ENOMEM
— недостаточно памяти для инициализации атрибутов барьера.

Функция разрушения атрибутов объекта возвращает значения:

EOK
— успешное выполнение;

EINVAL
— передан неверный объект атрибутов барьера
attr
.

Параметры барьера описываются типом

pthread_barrierattr_t
и аналогично другим типам синхронизации используются в момент инициализации элемента синхронизации. Фактически единственным атрибутом барьера является модификатор доступа к барьеру из других процессов:

int pthread_barrierattr_setpshared(

pthread_barrierattr_t* attr, int pshared);

int pthread_barrierattr_getpshared(

const pthread_barrierattr_t* attr, int* pshared);

По умолчанию атрибуты барьера запрещают доступ к элементу синхронизации из других процессов.

Обе функции могут возвращать следующие значения:

EOK
— успешное выполнение;

EINVAL
— одно или оба из переданных функции значений неверны.

Инициализация и разрушение барьера

int pthread_barrier_init(pthread_barrier_t* barrier,

const pthread_barrierattr_t* attr, unsigned int count);

Функция инициализирует объект синхронизации типа барьер, после чего его можно использовать. В атрибутах барьера устанавливается (или запрещается) возможность доступа к барьеру из других процессов. По умолчанию такой доступ запрещен. Для того чтобы изменить возможность доступа к созданному ранее барьеру, его необходимо разрушить, установить соответствующий атрибут и инициализировать барьер повторно. Параметр

count
показывает, какое количество потоков будет ожидать на барьере до их освобождения.

  • Читать дальше
  • 1
  • ...
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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