зпечує ексклюзивний доступ до буфера. Коли мінлива позитивна, це вказує число елементів у буфері, коли вона негативна, це вказує число споживчих потоків в черзі. p align="justify"> Мінлива event є локальної змінної, яка в даному контексті означає, що кожен потік має свою версію.
Досі ми припускали, що у всіх потоків є доступ до всіх змінним, але ми призначимо змінну до кожного потоку.
Є кілька способів, як це може бути реалізовано в різних умовах.
Якщо кожен потік має свій власний стек часу виконання, то будь-які змінні, що знаходяться в стеку, є змінними конкретного потоку.
Якщо потоки представлені як об'єкти, ми можемо додати атрибут до кожного об'єкту потоку
Якщо потоки мають унікальні ідентифікатори, ми можемо використовувати ідентифікатори в якості індексу масиву або хеш-таблиці, і зберігати там дані для кожного потоку. У більшості програми змінні є локальними, проте в нашому випадку змінні будуть загальними, якщо вони явно не обвялени як локальні. br/>
. Рішення проблеми виробника споживача
Код розв'язку:
1 event = waitForEvent ()
mutex.wait ()
buffer.add (event)
items.signal ()
mutex.signal ()
Лістинг. 4 Рішення виробника
Виробник не повинен отримати ексклюзивний доступ до буфера, поки не відбудеться подія. Кілька потоків можуть виконати waitForEvent одночасно. Items семафори відстежують число елементів у буфері. Кожен раз, коли виробник додає елемент, він сигналізує items, поступово збільшуючи його на один. p align="justify"> Код споживача аналогічний.
1 items.wait ()
2 mutex.wait ()
event = buffer.get ()
mutex.signal ()
event.process ()
Лістинг. 5 Рішення споживача
Буферні операції захищені м'ютексів, але перш ніж споживач добереться до нього, він повинен зменшити items. Якщо items дорівнює нулю або негативний, споживач блокується, поки виробник не подасть сигнал. p align="justify"> Хоча це рішення правильне, є можливість внести в нього невелике поліпшення. Уявімо собі, що по украй мірі один споживач стоїть у черзі, коли виробник сигналізує items. Якщо диспетчер дозволить працювати споживачеві, що відбудеться далі? Відбудеться негайна блокування м'ютексів, який поки ще захоплений виробником. p align="justify"> Блокування та активація є середньо витратними операціями, їх зайве виконання може погіршити якість програми. Таким чином, ймовірно, було б краще перебудувати виробника ось так:
event = waitForEvent ()
mute...