Интернет магазин китайских планшетных компьютеров



Компьютеры - Семафор (информатика)

24 февраля 2011


Оглавление:
1. Семафор (информатика)
2. Проблемы семафоров



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

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

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

init:
счётчик := n
 
enter:
ждать пока счётчик станет больше 0; после этого уменьшить счётчик на единицу.
 
leave:
увеличить счётчик на единицу.

Предположим, что есть такой участок кода:

semaphore.init;
.....
.....
void DoSomething
{
   semaphore.enter;
   .......
   semaphore.leave;
}

Тогда не более пяти потоков могут одновременно выполнять функцию DoSomething.

В более сложных семафорах может использоваться очередь; при этом потоки, ожидающие освобождения семафора, будут проходить через семафор именно в том порядке, в котором они вызывали enter.

Применение семафоров

Вот некоторые из проблем, которые могут решать семафоры.

  • запрет одновременного выполнения заданных участков кода;
  • поочерёдный доступ к критическому ресурсу.

Следующий пример показывает, как наладить поочерёдный доступ к консоли.

semaphore.init;
Поток 1:
semaphore.enter;
cout << "Состояние массива: ";
for
  cout << a << ' ';
cout << '\n';
semaphore.leave;
Поток 2:
semaphore.enter;
cout << "Нажато Esc.\n";
semaphore.leave;

Этот код поможет предотвратить появление листинга наподобие

Состояние массива: 1 2 3 Нажато Esc.
4 5 6


Просмотров: 2654


<<< Неблокирующая синхронизация
Состояние гонки >>>