c++ - 如何转储无序映射,同时添加和删除元素?

标签 c++ multithreading unordered-map

我想转储 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/

相关文章:

c++ - 如何在 C++ 中为元编程模板编写最后的递归

c++ - 是否可以序列化 QSettings 然后恢复它们?

c++ - std::thread 不退出

c# - 默认 SynchronizationContext 与默认 TaskScheduler

c++ - 空的 unordered_map 上的 find() 会导致访问冲突吗?

C++11 constexpr 字符串实现

java - Mac#doFinal() 在 Java 中是线程安全的吗?

c++ - 使用 unique_ptr 的 value_type 构造 unordered_map

c++ - 由于构造函数无法推回类对象

c++ - cout 变量和通过引用更改变量的函数