Составители:
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 ис-
пользуется как уникальный идентификатор объекта, по которому осуществ-
ляется ждущая блокировка. Все равно, что это за идентификатор, лишь бы
он был уникален и корректно использовался. Использование же в качестве
идентификатора адреса переменной есть надежный способ сгенерировать
уникальный номер, поскольку не бывает же двух переменных с одинаковым
адресом!
Страницы
- « первая
- ‹ предыдущая
- …
- 22
- 23
- 24
- 25
- 26
- …
- следующая ›
- последняя »
