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.
---
С уважением,
Лазарев Андрей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.