0

Я пытаюсь реализовать параллельную версию игры Game Of Life.Parallel Game Of Life - Обмен информацией между потоками

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

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

Итак, как я понимаю это, даже если один поток пытается прочитать только из ячейки вне его региона, он должен каким-то образом запросить это состояние из определенного потока, который запускает эту ячейку.

Мы рекомендуем рассмотреть решение производителя/потребителя для этой задачи, и поэтому я рассмотрел использование публичной статической очереди продуктов/потребителей, в которую запросы штата должны быть установлены в очередь, но некоторые другие связанные с этим проблемы не ясны:

  • Если поток а проводит работу в данный момент, как я могу попросить его, чтобы остановить его работу и резьба B это запрос информации и возобновить его предыдущую работу после этого? Возможно ли это?

  • Какой поток несет ответственность за эту очередь? уникальный поток, который управляет очередью параллельно потокам регулярных областей? Я не уверен.

+1

каждый регион thresd знает о количестве своих соседей за пределами своего региона. поэтому он должен подписаться на канал приемника, по которому поступают отсутствующие данные о занятости, и канал отправителя, текущие данные о занятости передаются. для каждой ячейки количество релевантных сообщений может быть сохранено после завершения всей необходимой информации. этот эскиз предполагает, что для игры есть синхронизирующая часовая нить. – collapsar

ответ

1

Самое легкое решение - представить себе, что в каждом раунде есть несколько шагов. Предположим, что существует N потоков.

  1. этап 1: каждая нить составляет список ячеек, которые необходимо обнаружить. Он ставит «вопрос» в одной из N очередей, которые есть (по одному для каждого потока).

  2. ждать все нити, чтобы закончить

  3. шаг 2: каждый поток заполнения ответов на его очередь вопрос

  4. ожидания для всех потоков для завершения

  5. шаг 3: каждая нить вычисляет новое состояние своей области

  6. Ждите, пока закончится все темы

+0

Я не уверен, что это отвечает на мой вопрос, но ваш совет использовать N очередей для каждого потока/региона звучит как хорошая идея для начала. Я постараюсь посмотреть, смогу ли я поместить это в свою игру :) Спасибо. – AdiB

+0

@AdiB Проблема в том, что если область имеет сторону N, она должна будет выполнить N * 4 запросов.Вы можете оптимизировать некоторые случаи (например, если у пустого пространства уже есть 4 или 5 полных пробелов, вам не нужно запрашивать другой поток, потому что это пространство не будет появляться) – xanatos

+0

@AdiB Этот автор http: // www .drdobbs.com/author/Clay-Breshears сделал цикл статей о параллелизации GoL – xanatos

Смежные вопросы