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

UptoLike

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

24
}
}
/**********************************************************/
Producer () // поток-производитель
{
while (1) {
// ждать прерывания от оборудования
pthread_sleepon_lock();
data_ready=1;
pthread_sleepon_signal(&data_ready)
pthread_sleepon_unlock()
}
}
Функция pthread_sleepon_wait() в действительности выполняет 3 дей-
ствия:
разблокирует мьютекс библиотеки ждущих блокировок;
выполняет собственно операцию ожидания события;
снова блокирует мьютекс библиотеки ждущих блокировок.
Причина обязательной разблокировки/блокировки мьютекса библиоте-
ки проста: необходимо запретить потоку-производителю изменять флаг. Но
если не разблокировать флаг впоследствии, то поток-производитель не
сможет его установить, чтобы сообщить о доступности данных.
Поток-производитель также блокирует мьютекс, чтобы получить моно-
польный доступ к флагу data_ready перед его установкой. Производитель
вызывает pthread_sleepon_signal(), «пробуждая» наиболее приоритетного
потребителя данных, и деблокирует мьютекс. Приоритетный потребитель,
блокированный по вызову pthread_sleepon_wait(), возвращается из состоя-
ния ожидания события и снова захватывает мьютекс. Флаг data_ready в
данном примере служит для двух целей:
Он является флагом состоянияпосредником между «Потребите-
лем» и «Производителем», указывающим на состояние системы. Если флаг
установлен в состояние 1, это означает, что данные доступны для обработ-
ки; если этот флаг установлен в состояние 0, это означает, что данных нет
и поток должен быть заблокирован.
Он выполняет функцию «места, где происходит синхронизация со
ждущей блокировкой». Другими словами, адрес переменной data_ready ис-
пользуется как уникальный идентификатор объекта, по которому осуществ-
ляется ждущая блокировка. Все равно, что это за идентификатор, лишь бы
он был уникален и корректно использовался. Использование же в качестве
идентификатора адреса переменной есть надежный способ сгенерировать
уникальный номер, поскольку не бывает же двух переменных с одинаковым
адресом!