Мобильное программирование приложений реального времени в стандарте POSIX


         

Если значение семафора было положительным,


Если значение семафора было положительным, все три перечисленные функции без каких-либо задержек завершаются успехом, уменьшая это значение до нуля и возвращая нулевой результат. В противном случае вызов sem_trywait() завершается неудачей, вызов sem_wait() блокируется до освобождения семафора, вызов sem_timedwait() также блокируется, но с контролем времени ожидания.

Освобождение семафора осуществляется функцией sem_post() (см. листинг 4.15). Для возобновления выполнения (если таковое имеет место) выбирается наиболее приоритетный поток управления, а среди потоков с равными приоритетами - тот, что ждал дольше других.

#include <semaphore.h> int sem_post (sem_t *sem);

Листинг 4.15. Описание функции sem_post(). (html, txt)

Функция sem_getvalue() (см. листинг 4.16) позволяет опросить значение семафора, не меняя его состояния.

#include <semaphore.h> int sem_getvalue (sem_t *restrict sem, int *restrict sval);

Листинг 4.16. Описание функции sem_getvalue(). (html, txt)

Значение семафора записывается по указателю sval. Если семафор был захвачен, это значение окажется нулевым или отрицательным.

Если сопоставить семафоры реального времени с теми, что были описаны в курсе [1], то можно сделать те же выводы, что и для очередей сообщений. Семафоры реального времени, согласно стандарту POSIX-2001, по сути являются бинарными. Они устроены проще и, следовательно, могут быть реализованы эффективнее. Главное - отсутствуют тяжеловесные, со сложной семантикой, трудные для реализации групповые операции.

Использование семафоров реального времени проиллюстрируем программой, реализующей взаимодействие поставщик/потребитель (см. листинг 4.17).

Листинг 4.17. Пример программы, реализующей взаимодействие поставщик/потребитель. (html, txt)

Применение неименованных семафоров в данном случае представляется вполне естественным. Поставщик захватывает семафор записи, заполняет буфер и освобождает семафор, разрешающий чтение. Потребитель действует симметричным образом.

Отметим, что семафоры ликвидируются после терминирования использующих их потоков управления, что, согласно стандарту POSIX-2001, является безопасным.


Содержание  Назад  Вперед