Параллельный завод / навесной вес с TBB - PullRequest
1 голос
/ 18 января 2012

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

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

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

1 Ответ

2 голосов
/ 18 января 2012

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

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

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

...