【发布时间】:2020-06-12 17:56:21
【问题描述】:
我在使用基于 shared_ptr 且兼作 LRU 的“数据库”时遇到了一个极端情况。
从 C++17 开始,shared_ptr::use_count 不精确,所以我很难确定哪些元素可以从 LRU 中安全删除。
我无法删除仍在使用的元素,因为这会破坏其余代码中的约定。
据我所知,锁定互斥锁是不够的,因为只有解锁互斥锁才会强制设置内存屏障。即使持有锁,我仍然可以读取过时的值。
我当然可以在将互斥锁锁定在 LRU 内之后设置内存屏障,但我有点担心性能影响。
这是 lru 工作原理的概述:
template <k,v>
class DB{
shared_ptr<V> emplace(k, args...) {
lock guard();
remove_elements_if_needed();
insert_if_new(k, args...);
refresh_lru(k);
return ptr;
}
};
【问题讨论】:
-
如果您正确使用互斥锁,我怀疑您是否需要内存屏障。但是这个问题太模糊了,任何人都无法提供帮助。
There is a high-level race condition, where after removing a still-in-use element that element could be re-created by another thread breaking uniqueness contracts.- 你需要详细说明这个细节并显示更多代码。 -
@selbie 更改了措辞。这部分与这个问题无关。
-
我有一些想法。但是你能展示可以用作minimal reproducible example 而不是伪代码的真实代码吗?在这种情况下,
k、v和V是什么? -
最好逐字显示你的
remove_elements_if_needed函数。
标签: c++ c++17 shared-ptr