2012-01-17 2 views
1

У меня есть образец мухи, работающий в серийном режиме, где завод использует std::map для хранения и предоставления доступа к созданным объектам. Заводская фабрика возвращает iterator, который указывает на объект на карте. Объекты на фабрике являются константами, поэтому они не будут обновляться после вставки, если они не будут удалены.Параллельная фабрика/мухи с TBB

Я хотел бы сделать фабрику одновременно с использованием tbb::concurrent_hash_map, но я не уверен, каково должно быть возвращение. Я мог бы использовать iterator (должен ли он быть const_iterator?), Но в документации говорится, что все итераторы недействительны, когда что-то делает find или insert в concurrent_hash_map. Поэтому я мог бы использовать const_accessor, так как нужен только доступ только для чтения, но тогда это отличается от последовательной реализации (iterator против accessor).

Какой из них лучше использовать? Должна быть важна последовательность в типах (например, итераторах)? Должны быть и серийные, и поточные параметры времени компиляции.

+0

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

ответ

2

Если вы не удаляете элементы одновременно с другими потоками, обращающимися к карте, вы можете вместо этого использовать tbb::concurrent_unordered_map. Это также ассоциативный контейнер на основе хешей, но с более простым и более похожим на STL API. Он не недействительными итераторами на insert и find, но в качестве компромисса он не позволяет одновременное удаление элементов.

Если вам нужно удалить элементы одновременно, единственным выбором с TBB является использование tbb::concurrent_hash_map с аксессуарами.

Я также предлагаю вам обсудить ваш вариант использования на the TBB forum.

Смежные вопросы