5.2.1. Выделение и освобождение семафоров
5.2.1. Выделение и освобождение семафоров
Функции semget() и semctl() выделяют и освобождают семафоры, функционируя подобно функциям shmget() и shmctl(). Первым аргументом функции semget() является ключ, идентифицирующий группу семафоров; второй аргумент — это число семафоров в группе; третий аргумент — флаги прав доступа, как в функции shmget(). Функция semget() возвращает идентификатор группы семафоров. Если задан ключ, принадлежащий существующей группе, будет возвращен ее идентификатор. В этом случае второй аргумент (число семафоров) может равняться нулю.
Семафоры продолжают существовать даже после того, как все работавшие с ними процессы завершились. Чтобы система не исчерпала лимит семафоров, последний процесс должен явно удалить группу семафоров. Для этого нужно вызвать функцию semctl(), передав ей идентификатор группы, число семафоров в группе, флаг IPC_RMID и произвольное значение типа union semun (оно игнорируется). Значение EUID (эффективный идентификатор пользователя) процесса, вызвавшего функцию, должно совпадать с аналогичным значением процесса, создавшего группу семафоров (либо вызывающий процесс должен быть запущен пользователем root). В отличие от совместно используемых сегментов памяти, удаляемая группа семафоров немедленно освобождается.
В листинге 5.2 представлены функции, выделяющие и освобождающие двоичный семафор.
Листинг 5.2. (sem_all_deall.c) Выделение и освобождение двоичного семафора
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>
/* Тип union semun необходимо определить самостоятельно. */
union semun {
int val;
struct semid_ds *buf;
unsigned short int* array;
struct seminfo *__buf;
};
/* Получаем идентификатор семафора и создаем семафор,
если идентификатор оказывается уникальным. */
int binary_semaphore_allocation(key_t key, int sem_flags) {
return semget(key, 1, sem_flags);
}
/* Освобождаем семафор, подразумевая, что пользователи
больше не работают с ним. В случае ошибки
возвращается -1. */
int binary_semaphore_deallocate(int semid) {
union semun ignored_argument;
return semctl(semid, 1, IPC_RMID, ignored_argument}
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Использование семафоров
Использование семафоров Классической областью применения семафоров является управление распределением конечных ресурсов, когда значение счетчика семафора ассоциируется с определенным количеством доступных ресурсов, например, количеством сообщений, находящихся в
Ограниченность семафоров
Ограниченность семафоров В Windows существуют важные ограничения, касающиеся реализации семафоров. Например, каким образом поток может потребовать, чтобы счетчик семафора уменьшился на 2? Для этого поток мог бы организовать ожидание два раза подряд, как показано ниже, но
Создание и инициализация семафоров
Создание и инициализация семафоров Реализация семафоров зависит от аппаратной платформы и определена в файле <asm/semaphore.h>. Структура struct semaphore представляет объекты типа семафор. Статическое определение семафоров выполняется следующим образом.static DECLARE_SEMAPHORE_GENERIC(name,
Использование семафоров
Использование семафоров Функция down_interruptible() выполняет попытку захватить данный семафор. Если эта попытка неудачна, то задание переводится в состояние ожидания с флагом TASK_INTERRUPTIBLE. Из материала главы 3 следует вспомнить, что такое состояние процесса означает, что задание
Освобождение параметров
Освобождение параметров int pthread_mutexattr_destroy(pthread_mutexattr_t* attr);Вызов разрушает ранее применявшийся объект - атрибутную запись мьютекса, после чего она уже не может более использоваться для инициализации мьютекса без предварительного выполнения вызова pthread_mutexattr_init().На этом
Освобождение мьютекса
Освобождение мьютекса int pthread_mutex_unlock(pthread_mutex_t* mutex);Функция pthread_mutex_unlock() освобождает мьютекс, на который ссылается переменная mutex. Вызвавший поток должен быть владельцем мьютекса. Если есть потоки, блокированные в ожидании освобождения мьютекса, то поток с наивысшим
Освобождение блокировки
Освобождение блокировки int pthread_rwlock_unlock(pthread_rwlock_t* rwl);Функция освобождает захваченный любым образом объект блокировки чтения/записи. Если объект был захвачен в режиме множественного использования (блокировки по чтению), то количество его освобождений должно равняться
6.5.6 Освобождение области
6.5.6 Освобождение области Если область не присоединена уже ни к какому процессу, она может быть освобождена ядром и возвращена в список свободных областей (Рисунок 6.25). Если область связана с индексом, ядро освобождает и индекс с помощью алгоритма iput, учитывая значение
12.3.1 Определение семафоров
12.3.1 Определение семафоров Семафор представляет собой обрабатываемый ядром целочисленный объект, для которого определены следующие элементарные (неделимые) операции:• Инициализация семафора, в результате которой семафору присваивается неотрицательное значение;•
12.3.2 Реализация семафоров
12.3.2 Реализация семафоров Дийкстра [Dijkstra 65] показал, что семафоры можно реализовать без использования специальных машинных инструкций. На Рисунке 12.6 представлены реализующие семафоры функции, написанные на языке Си. Функция Pprim блокирует семафор по результатам проверки
26.6.1. Создание множества семафоров
26.6.1. Создание множества семафоров Для создания множества семафоров или подключения к уже существующему множеству используется системный вызов semget():int semget(key_t key, int nsems, int semflg);Первый аргумент — это ключ IPC, который, как обычно, создается системным вызовом ftok(). Он
11.7. Ограничения семафоров System V
11.7. Ограничения семафоров System V На семафоры System V накладываются определенные системные ограничения, так же, как и на очереди сообщений. Большинство этих ограничений были связаны с особенностями реализации System V (раздел 3.8). Они показаны в табл. 11.1. Первая колонка содержит
4.4.3. Взаимоблокировки исключающих семафоров
4.4.3. Взаимоблокировки исключающих семафоров Исключающие семафоры являются механизмом, позволяющим одному потоку блокировать выполнение другого потока. Это приводит к возникновению нового класса ошибок. называемых взаимоблокировками или тупиковыми ситуациями. Смысл
5.2.2. Инициализация семафоров
5.2.2. Инициализация семафоров Выделение и инициализация семафора — две разные операции. Чтобы проинициализировать семафор, вызовите функцию semctl(), задав второй аргумент равным нулю, а третий аргумент — равным константе SETALL. Четвертый аргумент должен иметь тип union semun, поле
5.2.4. Отладка семафоров
5.2.4. Отладка семафоров С помощью команды ipcs -s можно получить информацию о существующих группах семафоров. Команда ipcrm sem позволяет удалить заданную группу, например:% ipcrm sem