Производитель-потребитель с интервальным разбиением - PullRequest
0 голосов
/ 25 января 2019

У меня есть интересный побочный продукт производитель-потребитель, и я не могу обернуться вокруг его алгоритма. Таким образом, каждый продюсер будет «производить» числа между заданным диапазоном (мин., Макс.), Которые дают одинаковое напоминание о делении на данный «фактор». То же самое касается потребителя .

Дополнительные требования: конечный буфер.

Мои мысли по этому поводу:

  • крупнозернистая очередь, которая использует блокировку и два условия для push и pop, наряду с рядом ожидаемых сторон и прибывающих сторон, используемых для определения очереди, все еще доступна для потребителей. (считается, что очередь доступна, если в ней еще есть элементы или есть активные авторы (прибыло! = ожидается))
  • a «Класс производителя», который содержит минимальное, максимальное, частное и общую очередь в качестве полей и имеет метод, который создает и возвращает значения на основе данных полей.
  • класс «Потребитель», который содержит те же поля, что и класс «Производитель», и имеет метод «потреблять», который извлекает элемент из очереди и «потребляет» (распечатывает) его. Потребитель будет потреблять до тех пор, пока очередь доступна.

Мои проблемы:

  • Как можно гарантировать, что все числа между данным интервалом рабочей нагрузки (начало, конец) будут производиться и потребляться х производителями и у потребителей (х! = У)?
  • Как реализовать механизм потребления?
  • Как можно выполнить разбиение значений производителей и потребителей, чтобы использовались все значения интервала рабочей нагрузки?

Я думал об использовании списка массивов для «буфера», и каждый потребитель будет выполнять поиск без блокировок для «совместимого» элемента для использования, удаляя элемент, если он доступен, или повторяя попытку, если его нет. Я думаю, что это было бы неэффективно из-за потерянных циклов ЦП при «попытках».

PS : Я использую Java для этого, но псевдокод тоже хорош.

Заранее спасибо!

1 Ответ

0 голосов
/ 25 января 2019

Чтобы быть уверенным, что производитель производит все числа из заданного диапазона с одинаковым остатком, вы можете использовать следующий псевдокод

int current = start;
while (current++ <= end) { //assuming your ranges are inclusive
  if (current % quotient == 0) {
    publish(current);
  }
}

Для поддержки разбиения вам в основном нужен какой-то Map<YourKey, Queue>.Каждый производитель и потребитель будут связаны с ключом, а производитель будет публиковать в очереди, связанной с его ключом, а потребитель будет потреблять из очереди, связанной с его ключом.Вы можете использовать свой диапазон в качестве ключа для очереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...