Как вы упоминаете, есть много ответов "НЕ ДЕЛАЙТЕ ЭТОГО". Большинство, кажется, читают потоки как потоки ОС, используемые Java. Поскольку вы упомянули Erlang в своем посте, я хотел бы опубликовать более эрланг-центрированный ответ.
Моделирование этого типа моделирования с помощью процессов (или актеров, микропотоков, зеленых нитей, как их иногда называют) не обязательно требует какой-либо синхронизации. По сути, у нас есть пара (скорее всего, тысячи или сотни тысяч) физических объектов, которые необходимо смоделировать. Мы хотим симулировать эти объекты настолько реалистично, насколько это возможно, но, вероятно, есть также некоторый аспект реального времени (хотя это не обязательно, вы не упоминаете об этом в своем вопросе).
Простым решением было бы создание процесса Erlang для каждого объекта, отправка тиков всем им и сбор результатов моделирования, прежде чем переходить к следующему тику. Это на практике синхронизирует все. Это, конечно, скорее детерминированное решение и не гарантирует каких-либо свойств в реальном времени. Также нетривиально, как процессы взаимодействуют друг с другом, чтобы получить данные, необходимые для расчетов. Вам, вероятно, нужно сгруппировать их хитроумными способами (группы столкновений и т. Д.), Использовать процессы гибернации (которые поддерживает Erlang) для спящих объектов и т. Д., Чтобы ускорить процесс.
Чтобы получить свойства в реальном времени, вам, вероятно, нужно ограничить вычисления, выполняемые процессами (точность торговли для скорости). Возможно, это можно сделать, отправив тики без в ожидании ответов, и позволяя процессам объекта отвечать на каждый тик с их текущей позицией и другими необходимыми данными (даже если они могут быть приблизительными только в то время ). Как говорит DJClayworth , это может привести к накоплению ошибок при симуляции.
Полагаю, в некотором смысле вопрос действительно в том, можно ли использовать силу параллелизма для получения какого-то преимущества здесь . Если вам нужна синхронизация, это довольно сильный признак того, что вам не нужен параллелизм между каждым физическим объектом. Потому что вы, по сути, отбрасываете много вычислительного времени, ожидая других процессов. Вы можете использовать параллелизм во время вычислений, но это другое обсуждение, я думаю.
Примечание: ни одна из этих идей не учитывает фактические физические расчеты. Это не является сильной стороной Эрланга и может быть выполнено в библиотеке C или в любом другом месте, в зависимости от того, какие характеристики вы хотите.
Примечание: Я не знаю ни одного случая, когда это было сделано (особенно не мной), поэтому я не могу гарантировать, что это разумный совет.