我想转储 unordered_map 的键,同时能够同时添加和删除元素。完全倾倒需要4秒,太长了。是否可以在单独的线程中转储,如下所示:
while (1) {
pthread_mutex_lock( &mutex );
if(iter!=map.end()){
x=iter->first
iter++;
}
pthread_mutex_unlock( &mutex );
do_this(x); // this takes time to complete
}
在主线程中我有:
pthread_mutex_lock( &mutex );
map.erase(iter);
无序映射的删除方法会不会有问题,删除后迭代器会失效。
还有其他安全的并行转储方法吗?
最佳答案
对于 unordered_map
(以及一般的关联容器),erase()
成员函数不会使迭代器和对除已删除的。
但是,在这里,您可能会删除一个元素并使该元素的迭代器无效,同时您的循环保存该元素的迭代器:例如,如果您碰巧删除了将在中取消引用的下一个迭代器所引用的元素你的循环。
因此,您需要注意要删除的元素不会被您要在 while
循环的下一个循环中处理的迭代器引用:
pthread_mutex_lock( &mutex );
if (i != iter)
{
map.erase(i);
}
else
{
// Maybe store in a queue of elements to be removed after the loop is done
}
其中 iter
是循环中使用的迭代器变量。
关于c++ - 如何转储无序映射,同时添加和删除元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14673549/