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

UptoLike

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

22
Механизму условных переменных можно сопоставить следующую наглядную
аналогию из спортивной жизни. Представьте себе олимпийский стадион, трибуны ко-
торого практически полностью заполнены в ожидании предстоящего матча. Стадион
имеет несколько входов, которые осаждают болельщики. Каждый вход стадиона свя-
зан с собственной билетной кассой и независимым сектором на трибунах. Болельщики
пытаются проникнуть на стадион, честно купив билет в кассе сектора, однако их жела-
ния блокируются ответом кассира, что билетов нет. Но у болельщиков каждого секто-
ра есть один законный представитель на трибуне, с которым они могут общаться по
телефону. Представитель по запросу проверяет фактическое наличие мест в секторе.
Каждый болельщик пытается дозвониться своему представителю. Понятно, что в каж-
дый момент времени только один болельщик может говорить с представителем секто-
ра. По требованию болельщика представитель контролирует сектор, и предположим,
что он обнаружил одно свободное место. Тогда он сообщает, что есть одно свободное
место, и в кассе появляется один билет. Наибольшим приоритетом в получении биле-
та обладает болельщик, который стоит в очереди первым, скорей всего он и получит
заветный билет (если, конечно, в толпе ожидающих болельщиков нет VIP-персоны).
Может оказаться (хотя на мировом первенстве это маловероятно!), что представи-
тель обнаружил несколько мест и это число больше или равно числу ожидающих бо-
лельщиков на входе данного сектора, тогда они все смогут приобрести билеты и по-
пасть на стадион.
В данной ситуации болельщики соответствуют программным потокам, различные
входы на стадион с билетным кассиромразличным объектам CONDVAR, представи-
тель с последовательным доступом соответствует потоку-поставщику информации,
связанному с конкретным объектом CONDVAR. Критические ресурсы, охраняемые
мьютексом, – это разговор по телефону, а проверяемым условием является фактиче-
ское наличие мест в секторе. Представитель является источником либо вызова signal,
когда проходит один болельщик, либо broadcast – когда пропускают всех болельщиков
с данного входа. Ситуацию, когда в кассу поступило несколько билетов, но меньше,
чем ожидающее число болельщиков, для чистоты аналогии исключаем из рассмотре-
ния. Болельщики, попавшие на трибуну, занимают свободные места, а представитель
вновь начинает поиск свободных мест по запросам болельщиков.
Существует другой вид операции ожидания условной переменной
(pthread_cond_timedwait()) который позволяет установить тайм-аут. По
окончании этого периода ожидающий поток может быть разблокирован.
2.4. Ждущие блокировки
Типовая ситуация в многопоточных программахэто потребность за-
ставить поток «ждать чего-либо», например готовности данных от внешнего
устройства, заданной позиции конвейерной ленты, доступа к диску и т. д., т.
е. ждать освобождения какого-либо ресурса. Причем одного и того же собы-
тия могут ожидать несколько потоков. Для таких целей можно было бы ис-
пользовать условную переменную (CONDVAR), но гораздо проще исполь-
зовать ждущую блокировку (SLEEPON-LOCK). В действительности ждущие