Семафор (информатика)

Семафор (информатика)

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

См. также

Литература

Грегори Р. Эндрюс «Основы многопоточного, параллельного и распределённого программирования»

Ссылки


Wikimedia Foundation. 2010.

Смотреть что такое "Семафор (информатика)" в других словарях:

  • Семафор — (фр. Sémaphore, от греч. σήμα знак, сигнал и φορός несущий): Семафор (железная дорога) устройство для регулирования железнодорожного движения. Семафор способ визуальной связи между кораблями с использованием жестов. См. Русская семафорная… …   Википедия

  • Список (информатика) — У этого термина существуют и другие значения, см. Список. В информатике, список (англ. list)  это абстрактный тип данных, представляющий собой упорядоченный набор значений, в котором некоторое значение может встречаться более одного… …   Википедия

  • Флажковая сигнализация — Семафор: Семафор (железная дорога) устройство для регулирования железнодорожного движения. Семафор способ визуальной связи между кораблями с использованием жестов. См. Русская семафорная азбука. Семафор (информатика) объект, служащий для… …   Википедия

  • Состояние гонки — У этого термина существуют и другие значения, см. Гонки. Состояние гонки (англ. race condition)  ошибка проектирования многопоточной системы или приложения, при которой работа системы или приложения зависит от того, в каком порядке… …   Википедия

  • Диспетчер (операционные системы) — У этого термина существуют и другие значения, см. Диспетчер (значения). Диспетчер для операционной системы системное программное обеспечение, промежуточный слой между ОС РВ и функциональными задачами, обеспечивающий заданную временную диаграмму.… …   Википедия

  • Диспетчер реального времени — Диспетчер для операционной системы системное программное обеспечение, промежуточный слой между ОС РВ и функциональными задачами, обеспечивающий заданную временную диаграмму. Известны два типа построения диспетчера с запуском задач по расписанию… …   Википедия

  • Бит — Эта статья о единице измерения информации; другие значения: бит (значения). Наименование Международное по МЭК обозначение (англ.)[1] Русское По ГОСТ обозначение[2] Значение бит bit бит 1 октет, байт o, В Б (байт) 1 Б = 8 бит Бит (англ …   Википедия

  • Кортеж — Эта статья  о математическом понятии. О других значениях см. wikt:кортеж#Русский. Содержание 1 В математике 2 В программировани …   Википедия

  • Обобщённый алгебраический тип данных — один из видов алгебраических типов данных, который характеризуется тем, что его конструкторы могут возвращать значения не своего типа. Это понятие реализовано в нескольких языках программирования, в частности в языках ML и Haskell, причём в… …   Википедия

  • Множество (тип данных) — У этого термина существуют и другие значения, см. Множество (значения). Множество тип и структура данных в информатике, является реализацией математического объекта множество. Данные типа множество позволяют хранить ограниченное число значений… …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»

We are using cookies for the best presentation of our site. Continuing to use this site, you agree with this.