Я работаю над проектом симуляции, используя c ++ как для Windows, так и для Linux.
В симуляции будет несколько тысяч объектов (возможно, 3000-5000). Планируется иметь несколько потоков, выполняющих действия над объектами, чтобы можно было использовать многоядерные машины, например, один поток обрабатывает перемещение и расположение объектов, один (или более) обрабатывает взаимодействие между объектами, один обрабатывает создание новых объекты.
Однако для обеспечения правильной работы для этого потребуется синхронизация между потоками. Поэтому я подумал, что каждый объект должен содержать (pthread mutex / CRITICAL_SECTION) в зависимости от платформы, и тогда каждый поток может заблокировать объекты, над которыми он сейчас работает. Из-за большого количества объектов конфликт должен быть редким, поэтому он должен быть быстрым.
Итак, мой первый вопрос: слишком много мьютексов 3000-5000 pthread или критических секций Windows? Я не знаю, какие ограничения есть у обеих систем. Или есть лучший способ добиться этого?
Мой второй вопрос касается структур данных для хранения объектов. Поскольку объекты могут создаваться и «умирать», я считаю, что лучший способ - сохранить «список» активных объектов, через которые рабочие потоки могут проходить. C ++ список не является потокобезопасным, хотя. Если бы один из моих потоков удалил объект, мне нужно было бы синхронизировать его с другим объектом, выполнив «next ()» в списке. Кроме того, мне нужно убедиться, что «следующий» объект был заблокирован, прежде чем перемещать в него итератор, поэтому мне понадобится какая-то глобальная блокировка для всей коллекции, которую я должен получить до вставки / удаления объектов, но также и до переход к следующему объекту в потоке.
Это кажется довольно болезненным и потенциально медленным. Есть ли лучший способ?