Казалось бы, вот хочу простую штуку:
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.