Concurrency 并发缓存

Concurrency 并发缓存,concurrency,c++11,Concurrency,C++11,我正在寻找一个并发缓存结构。我使用的是微软的PPL,所以我有了并发\u无序\u映射类,但它似乎不是我所需要的。我有一个散列值,需要将它与指针类型关联,或者如果指针已经在缓存中,则返回该指针。我没有使用LRU或MRU缓存策略,值永远不会被删除,所以它更像是一个并发的备忘录 锁定现有的std::无序映射是否更简单?我不知道Microsoft PPL。我刚刚查看了英特尔并发无序映射的“英特尔线程构建块”头文件,它的insert函数返回false,作为键已在映射中时返回对的第二部分 这似乎正是你需要的。

我正在寻找一个并发缓存结构。我使用的是微软的PPL,所以我有了
并发\u无序\u映射
类,但它似乎不是我所需要的。我有一个散列值,需要将它与指针类型关联,或者如果指针已经在缓存中,则返回该指针。我没有使用LRU或MRU缓存策略,值永远不会被删除,所以它更像是一个并发的备忘录


锁定现有的
std::无序映射是否更简单?

我不知道Microsoft PPL。我刚刚查看了英特尔并发无序映射的“英特尔线程构建块”头文件,它的
insert
函数返回
false
,作为键已在映射中时返回对的第二部分

这似乎正是你需要的。执行插入,如果它返回
true
,则它是一个新的插入。如果它返回
false
,那么它已经在映射中了


编辑:这里似乎有些混乱。我不是说你应该一直运行插入。我的意思是,您应该查找该值,如果该值丢失,则尝试插入。两个或多个线程偶尔会在insert上竞争,因此工作会重复,但这应该是一个罕见的事件。

使用
并发\u无序\u map
到底有什么问题?无序映射是一个散列结构,你说你有一个散列值,所以…@Zan Lynx:因为只有在单个原子操作中不存在时,接口才提供插入。基于现有接口只保证一次插入不是线程安全的。这是一条非常重要的信息,应该成为您的问题的一部分,可能是标题。如果仔细阅读,我想它在问题中,但它不会跳到我身上。不,这不是我需要的,因为当我得到一个重复的插入时,要得到我需要的行为已经太晚了。@DeadMG:那么我想你必须更仔细地解释你需要什么。这是一个并发的备忘录。记忆定义为只运行该函数一次。插入两次会使函数运行两次。@DeadMG:除非你的函数有副作用,而它可能不应该有副作用,那么谁在乎你是否偶尔运行两次呢?@DeadMG:而且,在我看来,这个问题有一个简单的解决方案。插入带有占位符值的记忆键,该占位符值指示“正在进行计算”。调用该值的线程然后在条件变量/信号量上堆积,直到结果准备好。更复杂,但可能是得到你想要的唯一方法。