tbb concurrent_hash_map const_accessor
От: vng Беларусь https://organicmaps.app/
Дата: 25.02.19 00:39
Оценка:
Казалось бы, вот хочу простую штуку:
using map_t = tbb::concurrent_hash_map<T1, T2>;

void insert(map_t & theMap, map_t::const_accessor & readAcc, T1 const & key)
{
  map_t::accessor writeAcc;
  if (theMap.insert(writeAcc, key, T2()))
  {
    // сложная функция инициализация значения через *writeAcc
  }
  readAcc = writeAcc.downgrade_to_reader();
}


Проблема: downgrade_to_reader существует номинально, но скрыто private наследованием .. Причины этого мне не совсем ясны.
Как сделать кошерно аналог приведенного мной фрагмента?
Связка insert + find не катит ибо:
void insert(map_t & theMap, map_t::const_accessor & readAcc, T1 const & key)
{
  {
    map_t::accessor writeAcc;
    if (theMap.insert(writeAcc, key, T2()))
    {
      // сложная функция инициализация значения *writeAcc
    }
  }
  // тут потенциально может быть гонка и значение по key будет удалено другим потоком
  theMap.find(readAcc, key);
}

да и негоже делать 2 обращения когда можно и нужно делать за один insert.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.