Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 30 стр.

UptoLike

Составители: 

30
Отметим, что невозможно реализовать такую форму синхронизации с
помощью мьютекса, поскольку он рассчитан только на один поток, что было
бы хорошо в случае записи, но мьютекс не способен разрешить доступ к
разделяемой области данных нескольким потокам в случае чтения. Сема-
фор также бесполезен, потому что не позволяет различить 2 режима досту-
паприменение семафора могло бы обеспечить доступ нескольких «чита-
телей», но при попытке «писателя» завладеть семафором его вызов ничем
бы не отличался от вызовов «читателей», что привело бы к ситуации с
множеством неблокированных «писателей».
2.9. Синхронизация через диспетчеризующий механизм
Выбор дисциплины диспетчеризации типа FIFO («первый вошелпер-
вый вышел») гарантирует, что никакие 2 потока с одинаковым приоритетом
не смогут одновременно выполнять критическую секцию, а будут делать это
только последовательно, когда один поток передаст процессор другому по-
току. При практической реализации этого механизма необходимо:
обеспечить условия, при которых все потоки, имеющие доступ к кри-
тической секции, имели бы одинаковый приоритет;
тщательно документировать программный продукт, организационно
исключив возможность изменения дисциплины диспетчеризации FIFO;
не применять данный механизм для многопроцессорных платформ.
2.10. Синхронизация через атомарные функции
Термин атомарный означает неделимый. В некоторых случаях может
потребоваться выполнить короткую математическую операцию с гарантией,
что она не будет прервана другим потоком или процедурой прерывания. В
QNX-Neutrino этот механизм обеспечивается атомарными операциями,
представленными в табл. 2.6.
Таблица 2.6
Функция Описание
atomic_add(), atomic_add_value() Добавление значения
atomic_clr(), atomic_clr_value() Сброс бит
atomic_set(), atomic_set_value() Установка бит
atomic_sub(), atomic_sub_value() Вычитание значения
atomic_toggle(), atomic_toggle_value() Переключение бит
Все операции выполняются над одной переменной. Версии операций с
добавкой _value возвращают, кроме того, прежние значения переменной.