2010-03-01 2 views
2

Я ищу ассоциативный контейнер, который обеспечивает безопасное одновременное чтение & доступ на запись при условии, что вы никогда не читаете и не записываете такой же элемент.Конъюнктивные контейнеры C++?

В принципе у меня есть эта установка:

Тема 1: Создать, напиши в контейнер Отправить по сети.

Нить 2: Получите отклик на A, Прочитайте A из контейнера, сделайте некоторую обработку.

Я могу гарантировать, что мы только когда-либо пишем A один раз, хотя мы можем получить несколько ответов для A, которые будут обрабатываться последовательно. Это также гарантирует, что мы никогда не читаем и не пишем A в то же время, так как мы можем получить ответ только на A после его отправки.

Так что в основном я ищу контейнер, в котором запись в элемент не беспорядок с любыми другими элементами. Например, std::map (или любая другая древовидная реализация) не удовлетворяет этому условию, поскольку его базовая реализация является красно-черным деревом, поэтому любая заданная запись может перебалансировать дерево и взорвать любые одновременные операции чтения.

Я думаю, что std::hash_map или boost::unordered_set могут работать для этого, основываясь только на моем предположении, что обычная реализация хеш-таблицы будет удовлетворять моим критериям, но я не уверен, и я не могу найти документацию, которая мне скажет. Кто-нибудь еще пытался использовать их аналогично?

ответ

1

STL не предоставляет никаких надежных гарантий относительно потоков, так как стандарт C++ не упоминает темы вообще. Я не знаю о повышении, но я был бы удивлен, если бы его контейнеры предоставили гарантии параллелизма.

Что относительно concurrent_hash_map от TBB? Я нашел это в this related SO question.

+0

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

+0

Это GPL. Разве это недостаточно свободно? –

+0

Упс. Да, после прочтения веб-сайта он выглядит как бесплатный даже для коммерческого использования, если вы не хотите их пакета поддержки. Кроме того, он не блокируется, он использует мелкозернистую блокировку, но похоже, что он работает очень хорошо, я определенно собираюсь провести сравнительный анализ против того, что я использую сейчас (std :: map с закрытой блокировкой). –

0

Реализация обычной хэш-таблицы повторяется при увеличении количества сохраненных элементов, поэтому, вероятно, это не вариант, если вы знаете, что этого не происходит.

Я бы посмотрел на структуры, используемые для функциональных языков (например, посмотрите на http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf), но обратите внимание, что те, о которых я сейчас думаю, зависят от сбора мусора.

+0

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

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