Семафор (информатика)
Семафо́р — объект, позволяющий войти в заданный участок кода не более чем 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 · Шаблон · Конструктор типа · Parametric polymorphism |

