У меня есть пул потоков с некоторыми потоками (например, числом ядер), которые работают со многими объектами, скажем, тысячами объектов. Обычно я предоставляю каждому объекту мьютекс для защиты доступа к его внутренним объектам, блокирую его, когда я делаю работу, а затем освобождаю его. Когда два потока пытаются получить доступ к одному и тому же объекту, один из потоков должен ждать.
Теперь я хочу сохранить некоторые ресурсы и быть масштабируемым, так как могут быть тысячи объектов, и все еще только на несколько потоков. Я имею в виду дизайн класса, в котором у потока есть какой-то объект мьютекса или блокировки, и он назначает блокировку для объекта, когда к объекту необходимо получить доступ. Это позволит сэкономить ресурсы, поскольку у меня есть только столько объектов блокировки, сколько у меня потоков.
Теперь идет часть программирования, где я хочу перенести этот дизайн в код, но не знаю, с чего начать. Я программирую на C ++ и хочу использовать классы Boost, где это возможно, но самостоятельно написанные классы, которые обрабатывают эти специальные требования, в порядке. Как бы я это реализовал?
Моей первой идеей было создание объекта boost :: mutex для каждого потока, и каждый объект имеет boost :: shared_ptr, который изначально не установлен (или равен NULL). Теперь, когда я хочу получить доступ к объекту, я блокирую его, создав объект scoped_lock и назначив его для shared_ptr. Когда shared_ptr уже установлен, я жду на текущую блокировку. Эта идея звучит как куча полных гоночных условий, поэтому я как бы отказался от нее. Есть ли другой способ выполнить этот дизайн? Совершенно другой путь?
Edit:
Приведенное выше описание немного абстрактно, поэтому позвольте мне добавить конкретный пример. Представьте себе виртуальный мир со многими объектами (думаю,> 100 000). Пользователи, движущиеся по миру, могут перемещаться по миру и изменять объекты (например, стрелять стрелами в монстров). Когда я использую только один поток, я хорошо работаю с рабочей очередью, где изменения в объектах стоят в очереди. Я хочу более масштабируемый дизайн, хотя. Если доступно 128 ядерных процессоров, я хочу использовать все 128, так что используйте это количество потоков, каждое с рабочими очередями. Одним из решений будет использование пространственного разделения, например, используйте замок для области. Это может уменьшить количество используемых блокировок, но меня больше интересует, есть ли дизайн, который экономит как можно больше блокировок.