并发缓存

4
我正在寻找一种并发缓存结构。我正在使用来自Microsoft的PPL,因此我有concurrent_unordered_map类,但它似乎不完全符合我的需求。我有一个哈希值,需要将其与指针类型关联起来,或者如果该指针已经在缓存中,则返回该指针。我不使用LRU或MRU缓存策略,并且值永远不会被删除,因此更像是一个并发的记忆化。

是否更简单地锁定现有的std::unordered_map


1
使用 "concurrent_unordered_map"有什么问题呢?无序映射是一种哈希结构,而且你已经有了一个哈希值,所以... - Zan Lynx
@Zan Lynx:因为该接口不提供仅在单个原子操作中不存在时插入。基于现有接口保证仅插入一次将无法保证线程安全。 - Puppy
这是一个非常重要的信息,应该作为你的问题的一部分,并且可能需要出现在标题中。 - Zan Lynx
1
如果仔细阅读问题,我想答案就在问题中,但是它没有立刻显现出来。 - Zan Lynx
1个回答

1

我不知道 Microsoft PPL。 我只看了 Intel Thread Building Blocks 的头文件,针对Intel的concurrent_unordered_map和其insert函数返回值的第二部分为false,当键已在映射中时。

这似乎正是你所需要的。 进行插入操作,如果它返回true,则它是新插入的。 如果返回false,则它已经存在于地图中。

编辑:这里似乎有些混淆。 我的意思不是您应该始终运行插入操作。 我的意思是您应该查找该值,如果缺少,则尝试插入。 两个或更多线程可能会偶尔在插入期间竞争,因此工作将被重复执行,但这应该是一个罕见的事件。


@DeadMG:那么我想你需要更仔细地解释你需要什么。 - Zan Lynx
这是一个并发的记忆化。记忆化被定义为仅运行函数一次。插入两次将会运行函数两次。 - Puppy
@DeadMG:除非你的函数有副作用,但它可能不应该有,否则谁在乎你偶尔运行两次呢? - Zan Lynx
备忘录技术适用于非常细致耗时的函数,这些函数运行两次非常昂贵。更重要的是,在这种情况下,我正在堆分配结果,并且需要引用相等性在返回值中。如果我插入两次,那么不仅会浪费大量时间,而且还会丢失原始值,现在结果将不再相等比较。 - Puppy
2
@DeadMG:而且,我觉得这个问题有一个简单的解决方案。插入带有占位符值的记忆化键,表示“正在计算”。拉取该值的线程然后堆积在条件变量/信号量上,直到结果准备好。更复杂,但可能是实现你想要的唯一方法。 - Zan Lynx
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接