Задачка о поставщике и потребителе
От: Kerk Россия  
Дата: 16.10.03 07:10
Оценка:
Есть какая-то абстрактная структура (для задачи в принципе не важно какая), состоящая из N ячеек. Поставщик заполняет эти ячейки данными по одной за раз... Потребитель "вытаскивает" эти данные из ячеек по одной... Если структура заполнена, поставщик должен ждать, и, соответственно, если структура пуста, то ждать должен потребитель... Этот алгоритм легко реализуется с двумя семафорами...
Вопрос: можно ли это реализовать используя ОДИН семафор.
No taxation without representation
Re: Задачка о поставщике и потребителе
От: Tan4ik Россия  
Дата: 16.10.03 07:30
Оценка: 3 (1)
Здравствуйте, Kerk, Вы писали:

K>Есть какая-то абстрактная структура (для задачи в принципе не важно какая), состоящая из N ячеек. Поставщик заполняет эти ячейки данными по одной за раз... Потребитель "вытаскивает" эти данные из ячеек по одной... Если структура заполнена, поставщик должен ждать, и, соответственно, если структура пуста, то ждать должен потребитель... Этот алгоритм легко реализуется с двумя семафорами...

K>Вопрос: можно ли это реализовать используя ОДИН семафор.

Мы обойдемся меньшим: нам нужен всего один Event.

HANDLE hEvent //Событие для ожидания
UINT nCount //Кол-во заполненных ячеек


Действия поставщика:

if (nCount == N)
  WaitForSingleObject(hEvent, INFINITE);
//заполнить свободную ячейку
nCount++;
if (nCount == N)
  ResetEvent(hEvent)  // Нам в следующий раз придется ждать
if (nCount == 1)
  SetEvent(hEvent)  // Потребитель дождался


Действия потребителя:

if (nCount == 0)
  WaitForSingleObject(hEvent, INFINITE);
//взять заполненную ячейку
nCount--;
if (nCount == 0)
  ResetEvent(hEvent)  // Нам в следующий раз придется ждать
if (nCount == N-1)
  SetEvent(hEvent)  // Поставщик дождался


Предполагается, что N>1.
---
С уважением,
Лазарев Андрей
Re[2]: Задачка о поставщике и потребителе
От: Kerk Россия  
Дата: 30.10.03 08:26
Оценка:
Вау! Супер! Огромная (!!!) благодарность!
No taxation without representation
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.