140
Два метода синхронизации:
один метод с применением
функции
pthrea. dJoin(), который мы только что рассмотрели, и
метод с применением барьера.
Основной поток должен дождаться того момента,
когда все
рабочие потоки завершат работу, и только затем можно начинать
следующую часть программы.
Однако с применением функции
pthreadJoin () мы ожидаем
завершения потоков. Это
означает, что на момент ее
разблокирования потоков нет больше с нами; они закончили работу
и завершились.
В случае с барьером мы ждем «встречи» определенного числа
потоков у барьера. Когда заданное число потоков достигнуто, мы их
все разблокируем (заметьте, что потоки при этом продолжат
выполнять свою работу).
Сначала барьер следует
создать при помощи функции
barrier_init0:
#include
int
barrier_init (barrier t *barrier,
const barrier attr t *attr,
int count) ;
Эта функция создает объект типа «барьер» по переданному ей
адресу (указатель на барьер хранится в параметре barrier) и
назначает ему атрибуты, которые определены в attr (мы будем
использовать NULL, чтобы установить значения по умолчанию).
Число потоков, которые должны вызывать функцию barrier_wait(),
передается в параметре count.
После того как барьер создан, каждый из потоков должен
будет вызвать функцию barrier_wait(), чтобы сообщить, что он
отработал:
#include
int barrier_wait (barrier t *barrier) ;
141
После того как поток вызвал
barrier_wait(), он будет
блокирован до
тех пор, пока число потоков, указанное
первоначально в параметре
count функции
barrier_mit(), не вызовет
функцию
barrier'_waU() (они также будут блокированы). После того
как нужное число потоков выполнит вызов функции
barrier_wait(),
все эти потоки будут разблокированы «одновременно».
Do'stlaringiz bilan baham: