Семафор (информатика) | это... Что такое Семафор (информатика)? (original) (raw)
У этого термина существуют и другие значения, см. Семафор.
Семафо́р — объект, позволяющий войти в заданный участок кода не более чем n потокам. Определение введено Эдсгером Дейкстрой.
Семафоры используются при передаче данных через разделяемую память.
Содержание
- 1 Определение семафора
- 2 Применение семафоров
- 3 Проблемы семафоров
- 4 См. также
- 5 Литература
- 6 Ссылки
Определение семафора
Семафор — это объект, с которым можно выполнить три операции.
init(n): счётчик := n
enter(): ждать пока счётчик станет больше 0; после этого уменьшить счётчик на единицу.
leave(): увеличить счётчик на единицу.
Предположим, что есть такой участок кода:
semaphore.init(5); ..... ..... void DoSomething( void ) { 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 domain socket |
Избранные протоколыи стандарты | Apple events · COM+ · CORBA · D-Bus · DCE · DCOP · DIPC · ICE · LINX · ONC RPC · POSIX (различные методы) · SOAP · Thrift · TIPC · XML-RPC |
Типы данных | |
---|---|
Неинтерпретируемые | Бит • Ниббл • Байт • Трит • Трайт • Слово |
Числовые | Целый • С фиксированной запятой • С плавающей запятой • Рациональный • Комплексный • Длинный • Интервальный |
Текстовые | Символьный • Строковый |
Указатель | Адрес • Ссылка |
Композитные | Алгебраический тип данных (обобщённый) • Массив • Ассоциативный массив • Класс • Список • Кортеж • Объект • Option type • Product • Структура • Множество • Объединение (tagged) |
Другие | Логический • Низший тип • Коллекция • Перечисляемый тип • Исключение • First-class function • Opaque data type • Recursive data type • Семафор • Поток • Высший тип • Type class • Unit type • Void |
Связанные темы | Абстрактный тип данных • Структура данных • Интерфейс • Kind (type theory) • Примитивный тип • Subtyping • Шаблоны C++ • Конструктор типа • Parametric polymorphism |