假设您有一个数据结构,其中值保存在节点中,例如标准映射或列表,并且该结构有一个锁来保护它。假设值类型(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++ 中执行此操作的惯用方式是什么?