0

假设您有一个数据结构,其中值保存在节点中,例如标准映射或列表,并且该结构有一个锁来保护它。假设值类型(mapped_type用于映射)足够复杂,每个都有自己的锁。

所以基本操作就是获取地图的锁,获取(引用)值,然后解锁地图的锁。现在,您可以根据需要锁定该值的锁并参与其中。

问题 - 如我所见 - 是您无法分配引用 - 只能初始化它。所以我提出了以下类型的代码,给定一些M带有实例的映射类型m(它是 mutex m_mutex):

const MappedType& mt = [this, key]() -> const MappedType& {
  std::lock_guard _{m_mutex};
  return m[key];
}();

这就是您可以at用来添加元素的情况。如果您不想这样做,您可以:

const MappedType& mt = [this, key]() -> const MappedType& {
  std::lock_guard _{m_mutex};
  M::const_iterator it = m.find(key);
  if (m.cend() != it)
    return it->second;
  else
    return M::default_m;   // some static M to indicate 'missing', or maybe you throw
}();

好主意还是太聪明而无法通过代码审查?在现代 C++ 中执行此操作的惯用方式是什么?

4

0 回答 0