2010-11-30 7 views
3

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

Спасибо.

ответ

7

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

1

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

4

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

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


    stack.pop(); 
} 

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

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

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

2

Используйте Folly's AtomicHashmap.

С Folly's documentation на Github

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

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