27-09-2023
Семафо́р — объект, ограничивающий количество потоков, которые могут войти в заданный участок кода. Определение введено Эдсгером Дейкстрой. Семафоры используются при передаче данных через разделяемую память.
Семафор — это объект, с которым можно выполнить три операции.
init(n): счётчик := n enter(): ждать пока счётчик станет больше 0; после этого уменьшить счётчик на единицу. leave(): увеличить счётчик на единицу.
Предположим, что есть такой участок кода:
semaphore.init(5); // ..... // ..... void DoSomething() { semaphore.enter(); // ....... semaphore.leave(); }
Тогда не более пяти потоков могут одновременно выполнять функцию DoSomething()
.
В более сложных семафорах может использоваться очередь; при этом потоки, ожидающие освобождения семафора, будут проходить через семафор именно в том порядке, в котором они вызывали enter()
.
Вот некоторые из проблем, которые могут решать семафоры.
Следующий пример показывает, как наладить поочерёдный доступ к консоли.
semaphore.init(1); // Поток 1: semaphore.enter(); cout << "Состояние массива: "; for (int i=0; i<n; i++) cout << a[i] << ' '; cout << '\n'; semaphore.leave(); // Поток 2: semaphore.enter(); cout << "Нажато Esc.\n"; semaphore.leave();
Этот код поможет предотвратить появление вывода наподобие
Состояние массива: 1 2 3 Нажато Esc. 4 5 6
Во-первых, можно написать программу с «утечкой семафора», вызвав enter()
и забыв вызвать leave()
. Реже встречаются ошибки, когда дважды вызывается leave()
.
Во-вторых, семафоры чреваты взаимной блокировкой потоков. В частности, опасен такой код:
// Поток 1: semaphore1.enter(); semaphore2.enter(); // ... semaphore2.leave(); semaphore1.leave(); // Поток 2: semaphore2.enter(); semaphore1.enter(); // ... semaphore1.leave(); semaphore2.leave();
Это заготовка статьи о компьютерах. Вы можете помочь проекту, дополнив её. Это примечание по возможности следует заменить более точным. |
Межпроцессное взаимодействие в информатике | |
---|---|
Методы | Файл · Memory-mapped file · Обмен сообщениями · Message queue and mailbox · Именованный канал · Anonymous pipe · Pipe · Семафор (критическая секция, мьютекс, фьютекс) · Shared memory · Сигнал · Сокет · Сокет домена UNIX |
Избранные протоколы и стандарты |
Apple events · COM+ · CORBA · D-Bus · DCE · DCOP · DIPC · ICE · LINX · ONC RPC · POSIX (различные методы) · SOAP · Thrift · TIPC · XML-RPC |
Типы данных | |
---|---|
Неинтерпретируемые | |
Числовые | |
Текстовые | |
Ссылочные |
Адрес • Ссылка • Ссылка в С++ • Указатель • Обёртка |
Композитные |
Алгебраический тип данных (обобщённый) • Массив • Ассоциативный массив • Класс • Список • Кортеж • Объект • Структура • Множество • Объединение (меченое) |
Другие |
Логический • Низший • Высший • Перечисляемый • Коллекция • Исключение • Функциональный • Род (Метакласс) • Монада • Семафор • Поток • Void |
Связанные темы |
Семафор (информатика).