QNX/UNIX: Анатомия параллелизма
Шрифт:
Обратите внимание на параметр количества ожидающих на барьере
Применение барьеров подробно описано в литературе [1], поэтому мы не будем специально останавливаться на этом элементе синхронизации, тем более что это один из наиболее простых в применении элементов.
По непонятным причинам документация QNX [8] причисляет барьеры к элементам синхронизации ядра, однако никаких средств native API QNX, предназначенных для работы с барьерами, документация не описывает, а заголовочный файл
Выводы можно сделать самостоятельно.
Также несколько загадочно выглядит тот факт, что согласно документации QNX 6.2.1 все функции работы с барьером и его атрибутами описаны в заголовочном файле
Операции с барьерами
Параметры барьера
Следующие функции инициализируют и разрушают блок параметров барьера:
Функция инициализации возвращает следующие значения:
Функция разрушения атрибутов объекта возвращает значения:
Параметры барьера описываются типом
По умолчанию атрибуты барьера запрещают доступ к элементу синхронизации из других процессов.
Обе функции могут возвращать следующие значения:
Инициализация и разрушение барьера
Функция инициализирует объект синхронизации типа барьер, после чего его можно использовать. В атрибутах барьера устанавливается (или запрещается) возможность доступа к барьеру из других процессов. По умолчанию такой доступ запрещен. Для того чтобы изменить возможность доступа к созданному ранее барьеру, его необходимо разрушить, установить соответствующий атрибут и инициализировать барьер повторно. Параметр
Возвращаемые значения:
Функция разрушает барьер, после чего соответствующий элемент синхронизации
Возвращаемые значения:
Ожидание на барьере
Функция ожидания (синхронизации) на барьере:
Вызов этой функции приводит к блокированию потока до тех пор, пока на барьере не накопится количество заблокированных потоков, определенное ранее при вызове функции
Необходимо с особой осторожностью относиться к использованию барьеров для остановки и синхронизации потоков разных приоритетов. Поскольку потоки, ожидающие у барьера, находятся в блокировке на условной переменной (внутренней), то система никак не отслеживает эффекты, связанные с возможной инверсией приоритетов.
Если поток, блокированный на барьере, получает сигнал, для которого определен обработчик, то обработчик сигнала выполняется, но по завершении его выполнения поток вновь блокируется до выполнения условия барьера.
Документация QNX утверждает, что нельзя заранее сказать, какой поток будет освобожден первым, когда заданное количество потоков достигнет барьера. Учитывая, что при реализации операций над потоками использовалась комбинация мьютекса с условной переменной (как видно из приведенного выше определения, типа