В настоящее время я использую параллельную хэш-карту tbb для выполнения одновременных вставок в хеш-карту. Каждый ключ является строкой, а значение — вектором целых чисел. Я хотел бы добиться следующего: во время вставки, если ключ не существует, я вставляю его и добавляю значение к его вектору. Если он существует, я просто добавляю значение к его вектору.
После проверки API одновременной карты хеша tbb я заметил, что функции find и insert возвращают только логические значения. Так как же я могу вернуть указатель на ключ, если он существует?
Есть методы, которые требуют доступа в своих аргументах. Аксессор в основном указатель в сочетании с scoped_lock
защита одновременного доступа к элементу. Без блокировки элемент может быть изменен одновременно, что приводит к гонке данных. Поэтому никогда не используйте указатель на элемент в concurrent_hash_map напрямую (если он не защищен средством доступа).
Кроме того, вам не нужно find()
метод для вашей задачи, так как insert()
методы создают элемент, если он не существует.
Согласно Справочное руководство, хэш-карта имеет следующие методы, которые, вероятно, удовлетворят ваши потребности:
bool insert( accessor& result, const Key& key ); // creates new element by default
bool insert( accessor& result, const value_type& value );// creates new element by copying
Вот пример:
{
hash_map_t::accessor a;
hash_map.insert( a, key ); // creates by default if not exists, acquires lock
a->second.my_vector.push_back( value ); // new or old entry, add to vector anyway
} // the accessor's lock is released here