Семафор (информатика) | это... Что такое Семафор (информатика)? (original) (raw)

У этого термина существуют и другие значения, см. Семафор.

Семафо́р — объект, позволяющий войти в заданный участок кода не более чем n потокам. Определение введено Эдсгером Дейкстрой.
Семафоры используются при передаче данных через разделяемую память.

Содержание

Определение семафора

Семафор — это объект, с которым можно выполнить три операции.

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