Может ли многопоточье влиять на игру Conway's of Life Clone?

StackOverflow https://stackoverflow.com/questions/3301562

  •  26-09-2020
  •  | 
  •  

Вопрос

Я реализовал эту маленькую игру игру, которая (как-то?) похожа на игру Conway of Life:

0) У вас есть матрица цветных точек (значения RGB) 1) Если соседняя ячейка имеет более низкое значение X, чем ваш Y, поставьте Y= 0 на эту клетку (Где х и у красных || зеленый || синий) 2) Red Beats Green Beats Blue Beats Red

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

Может ли многопоточье предотвратить это (скажем, запуск двух потоков, один инициирующий в первой ячейке, а другой на последнем)?Пожалуйста, простите свое невежество по поводу параллелизма, но я чувствовал, что это был хороший способ начать работать с ним.

Это было полезно?

Решение

Мое предположение, что вы обновляете Matrix Inflace, тогда как вы должны скопировать след отслеживания старого состояния матрицы, обновляя новый, затем заменяя оригинал один за обновлением. Таким образом, вы не будете обновлять некоторые ячейки, затем на следующей строке тестируйте их значения. Таким образом, это была бы проблема алгоритма, не связанная с программированием (и, следовательно, многопотативная не может помочь).

Другие советы

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

Вам будет лучше адаптировать свой алгоритм, чтобы предотвратить это.

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

, пытаясь использовать состояние гонки, чтобы изменить поведение, вы делаете это очень недетерминированным, но не в хорошем смысле.Тебе будет намного лучше, пытаясь придумать другое решение (потенциально используя генератор псевдорабатывающего числа и т. Д.), а затем ввести многопоточенность, чтобы сделать его быстрее (надеюсь, не влияя на результаты).

.

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

Однако, если вы решите это сделать, имейте в виду, что все должно рассчитать то, что ему нужно для «следующего поворота» и поместить его в новую матрицу, когда в матрице (предпочтительно нет копирования, Просто измените указатель где-нибудь) в конце поворота, чтобы один нить не меняет значения, которые другие должны выполнять свои расчеты. Таким образом, нить нельзя разрешать «получить поворот вперед» каждого Другое. Это может означать, что оказывается неэффективным делать с несколькими потоками - ваш пробег может отличаться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top