Шрифт:
где
где
где
Неизвестно, почему слово "mutex" в имени функции
Использование семафоров
Функция
Функция
Для освобождения захваченного семафора необходимо вызвать функцию
Полный список функций работы с семафорами приведен в табл. 9.5.
Таблица 9.5. Список функций работы с семафорами
Функция | Описание |
---|---|
sema_init(struct semaphore*, int) | Инициализация динамически созданного семафора и установка для него указанного значения счетчика использования |
init_MUTEX(struct semaphore*) | Инициализация динамически созданного семафора и установка его счетчика использования в значение 1 |
init_MUTEX_LOCKED (struct semaphore*) | Инициализация динамически созданного семафора и установка его счетчика использования в значение 0 (т.е. семафор изначально заблокирован) |
down_interruptible(struct semaphore *) | Выполнить попытку захватить семафор и перейти в прерываемое состояние ожидания, если семафор находится в состоянии конфликта при захвате (contended) |
down(struct semaphore*) | Выполнить попытку захватить семафор и перейти в непрерываемое состояние ожидания, если семафор находится в состоянии конфликта при захвате (contended) |
down_trylock(struct semaphore*) | Выполнить попытку захватить семафор и немедленно возвратить ненулевое значение, если семафор находится в состоянии конфликта при захвате (contended) |
up(struct semaphore*) | Освободить указанный семафор и возвратить к выполнению ожидающее задание, если такое есть |
Семафоры чтения-записи
Семафоры, так же как и спин-блокировки, могут быть типа чтения-записи. Ситуации, в которых предпочтительнее использовать семафоры чтения-записи такие же как и в случае использования спин-блокировок чтения-записи.
Семафоры чтения-записи представляются с помощью структуры
где
Семафоры чтения-записи, которые создаются динамически, могут быть инициализированы с помощью следующей функции.
Все семафоры чтения-записи являются взаимоисключающими (mutex), т.е. их счетчик использования равен единице. Любое количество потоков чтения может одновременно удерживать блокировку чтения, если при этом нет ни одного потока записи. И наоборот, только один поток записи может удерживать блокировку, захваченную на запись, если нет ни одного потока чтения. Все семафоры чтения-записи используют непрерываемое состояние ожидания, поэтому существует только одна версия функции