Есть ли причина, по которой вы не можете получить доступ к concurrent_hash_map, используя операторы в квадратных скобках?
Я делаю это для того, чтобы облегчить читабельность кода (для ключей, которые должны быть на карте):
template <class Tkey, class Tval>
Tval concHashMapGet(concurrent_hash_map < Tkey, Tval >& chm , Tkey key)
{
concurrent_hash_map< Tkey, Tval >::const_accessor a;
if (chm.find(a, key))
return a->second;
else
throw;
}; //Will .release() when out of scope
И мне было интересно, пропустил ли я что-то в отношении правильного использования, потому что кажется, что вам нужно получить аксессор, затем запустить find, затем получить значение, а затем выпустить аксессор. Все это на карте нормалей или в ConcurrentDictionary в c # выполняется с помощью только оператора квадратной скобки. (Ну, я думаю, на карте STL нет синхронизации, но я за квадратными скобками.)
Также, если вы обнаружите какие-либо проблемы с этой функцией, дайте мне знать. Насколько я могу сказать, компилятор должен встроить это?
Ваша логика выглядит правильно, и нет более короткого пути сделать это, насколько я знаю. Причина, по которой concurrent_hash_map не имеет оператора [], заключается в том, что если бы он возвращал ссылку, как в std :: map :: opreator [], нам пришлось бы выбирать блокировку по умолчанию (accessor или const_accessor), и в зависимости от того, что мы выбрали, это могло бы быть неправильный выбор в некоторых случаях использования. Поэтому мы заставили звонящего сделать выбор.
Если вам не нужно стирать элементы одновременно, попробуйте вместо этого использовать tbb :: concurrent_unordered_map. Это более поздняя версия с интерфейсом без блокировки и оператором [].
Что касается примера кода, «throw;» нужно что-то выдать, если код всегда не вызывается из обработчика блока try.
Других решений пока нет …