unordered_map可以同时找到并插入吗?
Could unordered_map find and insert at the same time?
我是 c++ 多线程编程的新手。我从网上阅读了一些文档和一些文章,并注意到在 STL unordered_map 中同时允许多查找操作,而不允许多插入操作。
我有两个问题:
-
可以同时找到操作和插入操作吗?例如
std::string x = "jim"; std::string y = "marry"; std::unordered_map<std::string, int> map; // Thead A executes below code auto iterator = map.find(x); // Thread B executes below code map.insert(std::make_pair(y, "value"));
请注意,这里的 x 和 y是不一样的。
-
如果 x 和 y 相同怎么办?如果我们找到密钥并同时插入相同的密钥会发生什么?
谢谢大家,如果你用你获得这些知识的参考来回答这个问题。
标准容器不是线程安全的。因此,您需要将unordered_map
包装到类中,并公开线程安全函数以插入和查找项目,例如使用互斥锁。
下面是一些伪代码:
class my_map
{
private:
static std::mutex my_mutex;
typedef map<std::string, int> my_map;
std::unordered_map my_map;
public:
void insert(...)
{
my_mutex.lock();
map.insert(...);
my_mutex.unlock(); // still not safe in case of exception
}
my_map::iterator find(...)
{
my_mutex.lock();
var result = map.find(...);
my_mutex.unlock();
return result;
}
}
两者的答案: 由于C++内存模型的规则,这种数据竞争会导致未定义的行为。所以任何事情都可能发生。您必须保证头安全操作,并应添加 std::mutex,例如 (https://en.cppreference.com/w/cpp/thread/mutex(
相关文章:
- 将重物插入std::map
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- 找不到最新插入到 std::map 中的键
- 在 std::map 中插入数组元素
- 插入 std::set 作为 std::map 的键
- 通过构造函数插入 std::map
- 将带有模板的自定义类插入到 std::map 中
- std::map 索引运算符与插入方法的性能
- 尝试在 std::map 中插入抽象类时没有用于调用的匹配函数
- 如何在声明时将对象插入 std::map
- 如何在 std::map<const int、int> C++ 中重载插入运算符>>?
- 在 std::map 中插入对象时构造函数中变量的地址
- 在这种情况下,插入 std::map 可能会失败?
- 从元组向 std::map 插入值
- 如何在 C++11 中插入 std::map?
- std::map::emplace无法解决,但插入右值有效 - 为什么?
- C++ 堆栈中的类对象作为 Map 的值插入
- 查找并插入-STD :: MAP C
- 将项目插入到std :: map时错误
- 将列表初始化的对插入到 std::map 中