我是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相同怎么办?如果找到密钥并同时插入相同的密钥会发生什么?
如果您回答此问题并获得参考,您将获得知识。
答案 0 :(得分:1)
标准容器不是线程安全的。因此,您需要将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;
}
}
答案 1 :(得分:1)
这两个答案: 由于C ++内存模型的规则,这种数据争用导致不确定的行为。所以什么都可能发生。您必须保证安全执行操作,并应添加std :: mutex例如(https://en.cppreference.com/w/cpp/thread/mutex)