2014-05-06 3 views
3

В настоящее время я использую параллельную хеш-карту tbb для выполнения параллельных вставок в хэш-карту. Каждый ключ является строкой, а значение представляет собой вектор целых чисел. Я хотел бы получить следующее: во время вставок, если ключ не существует, я вставляю его и добавляю значение к его вектору. Если он существует, я просто добавляю значение к его вектору.tbb concurrent hash map find & insert

После проверки API-схемы сопоставления хэш-таблицы tbb я заметил, что функции поиска и вставки возвращают только логические значения. Итак, как я могу вернуть указатель на ключ, если он существует?

+0

Я ответил на ваш вопрос? – Anton

+0

Извините за задержку в маркировке правильного ответа. Да вы сделали. Спасибо за поддержку. Я вижу, что сообщество tbb конечно мало! – NewToAndroid

+1

спасибо :) Да, [tag: tbb] сообщество довольно маленькое, небольшое количество upvotes, вопросов, просмотров .. – Anton

ответ

5

Существуют методы, требующие доступа к своим аргументам. Аксессор - это в основном указатель, связанный с scoped_lock, защищающий одновременный доступ к элементу. Без блокировки элемент может быть изменен одновременно, приводя к расстановке данных. Поэтому никогда не используйте указатель на элемент в concurrent_hash_map напрямую (если не защищен аксессором).

Кроме того, для вашей задачи не нужен метод find(), так как методы insert() создают элемент, если он не существует.

Согласно Reference manual, хэш-карта имеет следующие методы, которые, скорее всего, удовлетворить ваши потребности:

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 
+0

Является ли accessor блокировкой блокировки только одной записью (как транзакционной памятью) или на всей карте (все операции будут как заблокирован, можно было бы сделать вручную со стандартным std :: unordered_map + std :: lock)? – DuckQueen

+0

Просто один элемент заблокирован аксессуаром, конечно. Обратите внимание, что это блокировка чтения и записи, см. Const_accessor – Anton

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