Синхронизированный unordered_map в C ++ - PullRequest
3 голосов
/ 30 ноября 2010

Я использую unordered_map от Boost.Есть ли синхронизированная версия unordered_map?Это потому, что у меня довольно много unordered_map, и ручная синхронизация с использованием блокировки была бы очень грязной.

Спасибо.

Ответы [ 4 ]

7 голосов
/ 30 ноября 2010

Невозможно эффективно инкапсулировать контейнеры, предлагающие STL-подобные интерфейсы (что делает и unordered_map) с автоматической блокировкой, поскольку существуют условия гонки, связанные с извлечением итераторов и позиций внутри строки, а затем с попыткой использования их в последующих операциях.Если вы можете найти какой-то менее гибкий интерфейс, который соответствует вашим потребностям, возможно, помещая любые сложные операции в одиночные вызовы заблокированных функций, то вы можете легко обернуть потокобезопасный класс вокруг контейнера, чтобы упростить ваше использование.

4 голосов
/ 30 ноября 2010

Вы уверены, что это то, что вам нужно?

while (!stack.empty())
{
  Element const e = stack.top();


  stack.pop();
}

В одном потоке этот код выглядит правильно.Однако, если вы хотите использовать многопоточность, просто наличие синхронизированного стека просто не обрезает его.

Что произойдет, если кто-нибудь еще выберет последний элемент ПОСЛЕ того, как вы проверили пустоту?1008 *

Существует не только синхронизация контейнера, чтобы перейти в многопоточность.Тем не менее, вы можете попробовать TBB.

2 голосов
/ 18 августа 2012

Используйте Фолли AtomicHashmap.

Из документации Фолли на Github

folly / AtomicHashmap.h представляет синхронизированную реализацию UnorderedAssociativeContainer, разработанную для максимальной производительности в многопоточных средах (примерно в 2-5 раз быстрее).чем tbb :: concurrent_hash_map) и хорошие свойства использования памяти.Поиск и итерация не требуют ожидания, вставка имеет гранулярность блокировки на уровне ключа, минимальные накладные расходы памяти и постоянные 32-битные идентификаторы могут использоваться для ссылки на каждый элемент.

Он поставляется с некоторыми ограничения хотя.

1 голос
/ 30 ноября 2010

Intel Thread Building Blocks * Библиотека 1002 * имеет класс tbb::concurrent_hash_map, который является неупорядоченной картой, позволяющей одновременный доступ.Внутренне он реализован с использованием мелкозернистой схемы блокировки, но основным результатом является то, что вы можете получить к ней доступ без условий гонки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...