библиотека Microsoft PPL: передача данных concurrent_vector только один раз

#concurrency #concurrent-vector

#параллелизм #параллельный вектор

Вопрос:

У меня есть Concurrency::concurrent_vector, и я хочу потокобезопасно возвращать новый элемент обратно только в том случае, если он еще не существует (вот почему я должен сначала выполнить поиск). Как я могу этого добиться? Мне нужна параллельная коллекция, которая является потокобезопасной при доступе итератора (запись, чтение одного и того же элемента), а также разрешает то, что я написал выше.

Уточнение вопроса: Какой контейнер лучше всего использовать, если поиск в нем в основном выполняется одновременно, если элемент не найден (более редко), потребуется вставка / возврат, и в случае, если элемент поиска найден (в большинстве случаев), необходимо обновление элемента (одновременное обновление того же итератора)

Из того, что уже доступно в VS2010, я видел concurrent_vector, но что это небезопасно при обновлении того же элемента, а также кажется, что мне нужна дополнительная блокировка на случай, если элемент не найден, и мне нужно добавить элемент из-за этого. Что вы думаете? Есть ли что-нибудь, что я могу использовать для устранения внешних блокировок (блокировок всего контейнера)?

Ответ №1:

Для описанного случая, вероятно, наилучшим было бы использовать (из Visual Studio) контейнер concurrent_unordered_map, который представляет собой контейнер на основе хэша, обеспечивающий параллельную итерацию, доступ к итератору (при условии синхронизации обновлений / считывания одного и того же значения элемента!), push_back-s, доступ к элементу на основе ключа (operator []).

Реализация контейнера доступна как часть пакета примеров среды выполнения с параллелизмом В случае, если поиск по ключу не требуется, можно также использовать другие параллельные контейнеры: http://msdn.microsoft.com/en-us/library/dd504906.aspx