Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 27 стр.

UptoLike

Составители: 

27
2.7. Семафоры
Семафор является другой общей формой синхронизации, которая по-
зволяет потокам объявлять свою активность и ждать на семафоре возмож-
ности исполнения.
Для пояснения принципа действия семафора рассмотрим аналогию из повсе-
дневной жизни. Предположим, что на входной двери дома висит несколько ключей.
Человек берет ключ, входит в дом и закрывает дверь изнутри. При этом количество
ключей снаружи уменьшается на единицу. Если человек покидает дом, то он закрыва-
ет дверь и вешает ключ снаружи, количество ключей снаружи при этом увеличивается
на единицу. Максимальное число людей, которые могут одновременно находиться в
доме, очевидно, равно числу существующих ключей. Если ключ один, то только один
человек сможет находиться в доме.
Создание семафора эквивалентно объявлению о числе существующих
ключей. Для инициализации семафора используется системный вызов
int sem_init( sem_t * sem, // указатель к объекту семафор
int pshared, // сфера действия семафора
unsigned value ); // число пропускаемых потоков
Если pshared 0, то семафор разделяемый, он управляет потоками
вне зависимости от их принадлежности к процессам.
Если pshared = 0, то семафор управляет потоками только в пределах
одного процесса. Каждый поток может взаимодействовать с семафором,
используя две функции:
int sem_post( sem_t * sem );
int sem_wait( sem_t * sem );
Функция post увеличивает значение счетчика семафора на единицу, а
функция wait декрементирует его. Если значение семафора не положитель-
но, то очередной поток блокируется по функции wait. Мнемоническая схема
работы семафора представлена на рис. 2.4.
Thread 1
Thread 2
Thread 3
Thread 1
Thread 2
Thread 3
Thread 4
Thread 4
Blocked
Running
Running
Running
wait
wait
wait
wait
Semaphore
Value = 3
Рис. 2.4