Нужен ли мьютекс в следующем параллельном вычислении клеточного автомата?
Я думал, что всегда рекомендуется использовать блокировку мьютекса при записи в общий ресурс при использовании параллельных потоков.
Мьютекс резко замедляет работу программы, но нужен ли он для того, чтобы данные в массиве 2d (futureOcean
) оставались безопасными/непротиворечивыми?
Когда мьютекс блокирует futureOcean
во время операций записи:
2 threads: 163.352990 seconds
5 threads: 515.739237 seconds
10threads: 1021.035517 seconds
Без использования мьютекса:
2 threads: 65.817534 seconds
10threads: 93.822217 seconds
Я реализую модель клеточного автомата, в частности, симуляцию рыбы, акулы и океана.
У меня есть двумерный массив 1000x600 с именем ocean
, который, очевидно, представляет океан.
И еще один двумерный массив 1000x600 с именем futureOcean
, в котором будут храниться состояния каждой ячейки для currentGeneration + 1
.
Первоначально ocean
заполняется:
- 50% воды, т.е. 0 значений.
- 25% рыбы т.е. положительные целые значения
- 25% акула т.е. отрицательные целые значения
Обработка одного поколения включает правила обработки для каждой ячейки в пределах ocean
.
Каждый раз, когда я вычисляю новое значение для текущей ячейки, я сохраняю его будущее значение во втором массиве 2d (futureOcean) в той же позиции row
/column
, что и исходное значение внутри ocean
. Таким образом, каждая ячейка в futureOcean
будет обновляться только один раз за поколение.
И я делаю это 20000 раз (поколений).