Семафоры реального времени
Семафор реального времени – это эффективный механизм синхронизации процессов, который представляет собой общесистемный разделяемый ресурс, имеющий неотрицательное целочисленное значение.
Основными операциями над семафором являются захват и освобождение. Если делается попытка захвата семафора, когда его значение равно нулю, выполнение вызывающего потока управления приостанавливается и он добавляется к множеству потоков, ждущих на семафоре.
Если при освобождении семафора множество ждущих потоков было непусто, один из них удаляется из этого множества и его выполнение возобновляется; в противном случае значение семафора просто увеличивается.
Семафоры бывают именованными и безымянными. Первые именуются цепочками символов и создаются функцией sem_open() с флагом O_CREAT, вторые создаются функцией sem_init().
Именованный семафор можно закрыть, обратившись к функции sem_close(), и удалить с помощью функции sem_unlink(); для ликвидации неименованных семафоров служит функция sem_destroy().
Для захвата семафоров служат функции sem_wait(), sem_trywait() и sem_timedwait().
Освобождение семафора осуществляется функцией sem_post().
Функция sem_getvalue() позволяет опросить значение семафора, не меняя его состояния.
Необходимо отметить, что описание семафоров реального времени в стандарте POSIX-2001 внутренне противоречиво. В большинстве мест явно написано, что семафоры эти целочисленные; в то же время, из описания функции sem_wait() следует, что имеются в виду бинарные семафоры. Вероятно, ошибочно это последнее описание.