【发布时间】:2018-08-31 23:43:29
【问题描述】:
我目前正在使用Facebook's concurrent hash map,我想知道这样的事情是否可行:
folly::ConcurrentHashMap<std::string, some_class> m;
// add some elements
const auto it = m.find("a");
// during this time, another thread removes the "a" element
if (it != m.end())
it->second.something(); // it is now an invalid iterator
在阅读了哈希图的来源之后,我发现了这个:
迭代器持有指向返回元素的危险指针。元素只能在迭代器仍然有效时访问!
这很令人不安,感觉使用任何返回的迭代器都是不安全的,是这样吗?
【问题讨论】:
-
有什么用吗?有使用迭代器的安全方法。显然,如果您在使用它们之前更改或删除它们指向的元素,那么您将处于危险的境地。
-
我认为在 folly 命名空间中使用任何东西都是......好吧,愚蠢 ^_^
-
@Galik 好吧,如果您在读取元素时无法删除或更改元素,那么并发哈希映射的意义何在?
-
@UKMonkey 很明显,愚蠢的是“好吧,std 没有做我们想要的。让我们自己构建一个替代 std 的替代品,它可以做我们想要的。会出什么问题?”要么,要么en.wikipedia.org/wiki/Folly
标签: c++ multithreading folly