Зміст
. Постановка завдання
. Сигнал виробника - споживача
. Рішення проблеми виробника споживача
. Deadlock # 4
. Виробник - споживач з кінцевим буфером
. Сигнал кінцевого буфера виробника споживача
. Кінцевий буфер виробника споживача. Рішення
. ОСРВ RTX
. Постановка завдання
10. Лістинг програми
. Результати роботи
Список літератури
1. Постановка завдання
У багатопоточних програмах часто виникає розподіл праці між потоками. У загальній картині деякі потоки є виробниками, а деякі споживачами. Виробники створюють дані і поміщають їх в структуру даних, споживачі забирають дані і обробляють їх. p align="justify"> Хорошим прикладом є програми, керовані подіями. "Подія" це те, що відбувається для того, що б програма відповіла: користувач натискає кнопку або переміщує миша, блок даних надходить з диска, пакет даних приходить по мережі, закінчується виконувана операція. p align="justify"> Всякий раз, коли відбувається подія, потік-виробник створює об'єкт події і додає його в буфер подій. Одночасно з цим, споживчі потоки беруть події з буфера і обробляють їх. У цьому випадку споживачів називають "оброблювачами подій"
Є кілька обмежень синхронізації, які потрібні нам для того, що б система функціонувала коректно.
У той час як елемент додається або видаляється з буфера, буфер знаходиться в неузгоджену стані. Таким чином, потоки повинні мати ексклюзивний доступ до буфера. p align="justify"> Якщо потік-споживач приходить, в той час, коли буфер порожній, відбувається блокування, поки виробник не додає новий елемент.
Припустимо, що виробники повинні виконати наступні операції багато разів:
event = waitForEvent ()
buffer.add (event)
Лістинг. 1 Основний код виробника
Крім того, передбачається, що споживачі виконають наступні операції:
event = buffer.get ()
event.process ()
Лістинг. 2 Основний код виробника споживача
Як було зазначено вище, доступ до буфера повинен бути ексклюзивним, але waitForEvent і event.process можуть спрацювати одночасно.
Задача: Додати в код виробника і споживача оператори синхронізації, для забезпечення її коректної роботи.
. Сигнал виробника - споживача
Змінні, які ми могли б використовувати:
mutex = Semaphore (1)
items = Semaphore (0)
local event
Лістинг. 3 Ініціалізація виробника-споживача
Взаємне виключення забе...